关于:
class Test
class << self
def hi
puts "Hi there"
end
end
我脑子里想出了以下图片:
由于Ruby中的所有内容都是对象,因此类本身就是类Class
的对象。通过调用class << self
,您可以从Class
内部打开Test
定义,并注入几个实例方法。由于Test
是Class
的一个实例,因此您可以像调用对象上的实例方法一样调用这些方法:Test.hi
。
以下是伪代码,它有助于可视化我之前的句子:
class Class
def hi
puts “Hi there”
end
end
Test = Class.new(class Test
end)
Test.hi
我说得对吗?
答案 0 :(得分:4)
假设我们有一个类obj
的对象A
。此时,obj
类的祖先层次结构为:
[A, ...]
class << obj; ... end
做的是它创建一个类B
,其唯一的实例是obj
,并将其放在obj
的祖先层次结构中,以便祖先的层次结构为obj
的班级成为:
[B, A, ...]
如果您在class << self; ... end
的上下文中编写Test
,那么它的主体将是一个唯一实例为Test
的类。如果在该主体中定义实例方法hi
,那么它将应用于该类的实例,即Test
。因此,您将能够Test.hi
。