7

关于:

class Test
  class << self
    def hi
      puts "Hi there"
    end
end

我在脑海中想出了以下图像:

因为在 Ruby 中一切都是对象,所以类本身就是 class 的对象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

我做对了吗?

4

1 回答 1

4

假设我们有一个obj类对象A。此时, 的obj类的祖先层次结构为:

[A, ...]

它的作用是class << obj; ... end创建一个B唯一实例为的类obj,并将其放入 的祖先层次结构中,obj以便obj的类的祖先层次结构变为:

[B, A, ...]

如果您class << self; ... end在 的上下文中编写Test,那么它的主体将是一个类,其唯一实例是Test。如果您hi在该主体中定义一个实例方法,那么它将应用于该类的实例,即Test. 因此,您将能够做到Test.hi

于 2013-02-17T20:18:47.187 回答