下面的代码输出"I I“。
class Thing
class << self
def foo
puts "I am #{self}."
end
end
end
Thing.foo我认为“自我”指的是一种类型的事物,但它指的是阶级事物。我从前面的一个问题(在评论中链接)中收集到,这与事物是对象的实例这一事实有关。以类<< self开头的块是否在"self“将事物称为实例的上下文中实际执行?这里发生什么事情?
发布于 2016-11-02 19:12:44
Inside方法self指实例、类/模块定义中的实例,但在任何方法之外--类/模块本身。
class Thing
puts self.inspect
def foo
puts self.inspect
end
end
puts "==="
Thing.new.foo尝试上面的代码,您可能会看到那里发生了什么:类首先被解析,第一个puts正在执行。然后puts "==="打印出"==="字符串。然后,从方法内部打印实例。
发布于 2016-11-02 19:16:47
让我们来找出答案。
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的单例类相同。
这篇文章由Yehuda是必需阅读。
https://stackoverflow.com/questions/40387792
复制相似问题