单例类中的实例变量

mha*_*eeb 7 ruby singleton

我有以下代码:

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类内?

ndn*_*kov 6

这是因为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)

  • @mhaseeb,出于同样的原因,给了`class Bar; 自我 def baz; 自我 结束; 最后,方法外的“ self”将是“ Bar”,但方法内的“ self”将是您调用它的任何实例。方法在类中定义,但是对所述类的实例起作用。 (2认同)