在`self.included`中设置变量

时间:2016-11-01 16:31:48

标签: ruby

在Ruby中,为什么我不能在模块的self.included方法中直接设置变量的值

例如,以下代码输出NilClass(表示尚未设置@sound变量):

module Animal
  def self.included(klass)
    attr_accessor :sound
    @sound = "Woof!" # <-- Variable assignment
  end

  def speak
    puts @sound.class
  end
end

class Dog
  include Animal
end

dog = Dog.new
dog.speak # => NilClass

但是,如果我在模块的@sound方法(而不是speak内)中设置self.included的值,则表示该变量设置正确。例如,以下代码输出String

module Animal
  def self.included(klass)
    attr_accessor :sound
  end

  def speak
    @sound = "Woof!" # <-- Variable assignment
    puts @sound.class
  end
end

class Dog
  include Animal
end

dog = Dog.new
dog.speak # => String

我原本期望上面的两个代码示例都输出String

1 个答案:

答案 0 :(得分:2)

在第一个示例中,self.included块中的接收器是Dog类,而不是它的实例,这意味着您正在定义 类实例变量 @sound,而不是实例变量。

您可以通过运行

进行检查
Dog.instance_variable_get(:@sound) # with first example

speak方法返回NilClass,因为dog没有定义@sound个实例变量。

在第二个示例中,您要定义 实例变量 @sound,因此它可以按预期工作。