"自我"是什么意思?

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)

我说得对吗?

saw*_*awa 4

假设我们有一个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。