spa*_*key 7 ruby metaprogramming
关于:
class Test
class << self
def hi
puts "Hi there"
end
end
Run Code Online (Sandbox Code Playgroud)
我脑子里想出了下面的图像:
由于一切都是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
Run Code Online (Sandbox Code Playgroud)
我说得对吗?
假设我们有一个objclass 的对象A。此时,obj的类的祖先层次结构为:
[A, ...]
Run Code Online (Sandbox Code Playgroud)
它的作用class << obj; ... end是创建一个B唯一实例为 的类obj,并将其放入 的祖先层次结构中obj,以便 的obj类的祖先层次结构变为:
[B, A, ...]
Run Code Online (Sandbox Code Playgroud)
class << self; ... end如果您在 的上下文中编写Test,那么它的主体将是一个类,其唯一实例是Test。如果您在该主体中定义实例方法hi,那么它将应用于该类的实例,即Test. 因此你将能够做到Test.hi。