2013-10-26 166 views
0

ClassA使用实例变量,包括几个模块中包含的模块

class ClassA 
    include Module1 
    include Module2  

    def initialize() 
    @some_var = ... 
    end 

end 

包含的模块有使用实例变量的方法@some_var

module Module1 
    def method1 
    @some_var.a() 
    end 
end 

module Module2 
    def method2 
    @some_var.b() 
    end 
end 

下面的代码工作正常,并正确

obj = ClassA.new 
obj.method1 
obj.method2 

但我不知道它是正确使用包含模块中的实例变量。也许我需要实现另一个架构。

回答

3

使用方法。他们不仅按预期工作,这也是一个适当的面向对象技术。你不应该侵入另一个对象的内部。

require 'ostruct' # for OpenStruct 

module Module1 
    def method1 
    some_var.a 
    end 
end 

class ClassA 
    include Module1 

    def initialize() 
    @some_var = OpenStruct.new(a: 1, b: 2) # construct some object with some methods 
    end 

    attr_reader :some_var 
end 

obj = ClassA.new 
obj.method1 # => 1 
+0

谢谢!使用attr_reader是最适合我的方式。第二个例子非常丑陋:) –

+2

我同意你的回答,但是如果你打算使用实例变量,我不会看到'instance_variable_get'与正常使用实例变量相比有什么优势。 – Max

+0

@Max:对。我想了一会儿,ivars没有工作。我重新检查,他们实际上工作。因此我删除了答案的第二部分。 –