在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
。
答案 0 :(得分:2)
在第一个示例中,self.included
块中的接收器是Dog
类,而不是它的实例,这意味着您正在定义 类实例变量 @sound
,而不是实例变量。
您可以通过运行
进行检查Dog.instance_variable_get(:@sound) # with first example
speak
方法返回NilClass
,因为dog
没有定义@sound
个实例变量。
在第二个示例中,您要定义 实例变量 @sound
,因此它可以按预期工作。