模块的实例变量是否在具有mixin的类之间共享?

时间:2012-02-23 10:11:24

标签: ruby variables scope instance mixins

我想知道Ruby模块的实例变量如何在多个类中进行“混合”'。我写了一个示例代码来测试它:

# Here is a module I created with one instance variable and two instance methods.
module SharedVar
  @color = 'red'
  def change_color(new_color)
    @color = new_color
  end
  def show_color
    puts @color
  end
end

class Example1
  include SharedVar
  def initialize(name)
    @name     = name
  end
end

class Example2
  include SharedVar
  def initialize(name)
    @name     = name
  end
end

ex1 = Example1.new("Bicylops")
ex2 = Example2.new("Cool")

# There is neither output or complains about the following method call.
ex1.show_color
ex1.change_color('black')
ex2.show_color

为什么它不起作用?有人可以解释@color实例在Example$个实例中的实际行为吗?

2 个答案:

答案 0 :(得分:11)

在Ruby模块中,类是对象,因此可以为它们设置实例变量。

module Test
  @test = 'red'
  def self.print_test
    puts @test
  end
end

Test.print_test #=> red

你的错误是认为变量@color与:

相同
module SharedVar
  @color
end

module SharedVar
  def show_color
    @color
  end
end

不是。

在第一个示例中,实例变量属于SharedVar对象,在第二个示例中,实例变量属于您包含模块的对象。

self 指针的另一种解释。在第一个示例中, self 指针设置为模块对象SharedVar,因此键入@color将引用对象SharedVar并且没有与另一个对象的连接。在第二个示例中,方法show_color只能在某个对象上调用,即ex1.show_color,因此 self 指针将指向ex1个对象。所以在这种情况下,实例变量将引用ex1 object。

答案 1 :(得分:0)

你已经在一个类中包含了一个模块..所以实例变量@color应该是Example1和Example2类的实例变量

因此,如果您想访问@color变量,则意味着您要为该类创建一个对象,然后您可以访问它

对于Ex

irb(main):028:0> ex1.change_color('black')
=> "black"
irb(main):029:0> ex1.show_color
black
irb(main):031:0> ex2.change_color('red')
=> "red"
irb(main):032:0> ex2.show_color
red