下面的代码输出“我是事。”
class Thing
class << self
def foo
puts "I am #{self}."
end
end
end
Thing.foo
我认为“自我”指的是Thing类型的对象,但它指的是Thing类。我从上一个问题(在评论中链接)中收集到,这与Thing是Object的一个实例有关。块是否以类&lt;&lt;开头? self实际上是在“self”指的是Thing作为实例的上下文中执行的?这里发生了什么?
答案 0 :(得分:5)
内部方法self
指的是实例,在类/模块定义中,但在任何方法之外 - 指向类/模块本身。
class Thing
puts self.inspect
def foo
puts self.inspect
end
end
puts "==="
Thing.new.foo
尝试上面的代码,你可能会看到那里发生的事情:首先解析类,然后执行第一个puts
。然后puts "==="
打印出"==="
字符串。然后,从方法内部打印实例。
答案 1 :(得分:4)
让我们找出答案。
class Thing
puts "self=#{self}"
class << self
puts "self in singleton class=#{self}"
def foo
puts "I am #{self}."
end
end
end
# self=Thing
# self in singleton class=#<Class:Thing>
和
Thing.foo
# I am Thing.
我们看到class << self
与class << Thing
相同。
这与
相同class Thing
end
class << Thing
puts "self in singleton class=#{self}"
def foo
puts "I am #{self}."
end
end
# self in singleton class=#<Class:Thing>
Thing.foo
# I am Thing.
班级中的 class << self
或班级外的class << Thing
只做一件事而且只做一件事:它将self
更改为Thing
在随后的块中的单例类。这就像说它将范围更改为块中的Thing
的单例类一样。
This article需要阅读。