Ruby 在包含的模块中使用实例变量

Ruby 在包含的模块中使用实例变量,ruby,Ruby,我有ClassA,它包括几个模块 class ClassA include Module1 include Module2 def initialize() @some_var = ... end end 包含的模块具有使用实例变量@some\u var module Module1 def method1 @some_var.a() end end module Module2 def method2 @some_var.

我有
ClassA
,它包括几个模块

class ClassA
  include Module1
  include Module2      

  def initialize()
    @some_var = ...
  end

end
包含的模块具有使用实例变量
@some\u 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

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

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

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

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

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

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

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

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

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

谢谢对我来说,使用attr_reader是更正确的方法。第二个例子很难看:)我同意你的答案,但是如果你打算使用实例变量,我不认为
instance\u variable\u get
比正常使用实例变量有什么优势。@Max:对。我有一秒钟认为ivars不起作用。我重新检查了一下,它们确实有效。因此,我删除了答案的第二部分。谢谢!对我来说,使用attr_reader是更正确的方法。第二个例子很难看:)我同意你的答案,但是如果你打算使用实例变量,我不认为
instance\u variable\u get
比正常使用实例变量有什么优势。@Max:对。我有一秒钟认为ivars不起作用。我重新检查了一下,它们确实有效。因此,我删除了答案的第二部分。谢谢!对我来说,使用attr_reader是更正确的方法。第二个例子很难看:)我同意你的答案,但是如果你打算使用实例变量,我不认为
instance\u variable\u get
比正常使用实例变量有什么优势。@Max:对。我有一秒钟认为ivars不起作用。我重新检查了一下,它们确实有效。因此,我删除了答案的第二部分。谢谢!对我来说,使用attr_reader是更正确的方法。第二个例子很难看:)我同意你的答案,但是如果你打算使用实例变量,我不认为
instance\u variable\u get
比正常使用实例变量有什么优势。@Max:对。我有一秒钟认为ivars不起作用。我重新检查了一下,它们确实有效。因此,我删除了答案的第二部分。