我有以下代码:
class Fish
# @message = "I can swim"
class << self
@message = "I can jump!"
define_method(:action) { @message }
end
end
Fish.action => nil
我取消注释上述@message
变量后,Fish.action
会返回I can swim
。为什么在这两种情况下都忽略了I can jump
消息。这是为什么?为什么Fish类被绑定到开头定义的@message
但不在singleton
类内?
答案 0 :(得分:5)
这是因为class << self
打开课程&#39;单例类上下文:
class Foo
p self # Foo
class << self
p self # #<Class:Foo>
define_method(:bar) { p self } # Foo
end
end
Foo.bar
您可以通过以下方式验证:
Fish.singleton_class.instance_variable_get(:@action) # => "I can jump!"