我有以下代码:
class Fish
# @message = "I can swim"
class << self
@message = "I can jump!"
define_method(:action) { @message }
end
end
Fish.action => nil
Run Code Online (Sandbox Code Playgroud)
一旦我取消注释上面的@message变量,就Fish.action返回I can swim.为什么在这两种情况下都忽略了I can jump消息.这是为什么?为什么Fish类被绑定到@message开头定义但不在singleton类内?
这是因为class << self打开了类的单例类上下文:
class Foo
p self # Foo
class << self
p self # #<Class:Foo>
define_method(:bar) { p self } # Foo
end
end
Foo.bar
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式验证:
Fish.singleton_class.instance_variable_get(:@action) # => "I can jump!"
Run Code Online (Sandbox Code Playgroud)