什么类<<自我意味着?

时间:2013-02-17 20:11:04

标签: ruby metaprogramming

关于:

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

我脑子里想出了以下图片:

由于Ruby中的所有内容都是对象,因此类本身就是类Class的对象。通过调用class << self,您可以从Class内部打开Test定义,并注入几个实例方法。由于TestClass的一个实例,因此您可以像调用对象上的实例方法一样调用这些方法:Test.hi

以下是伪代码,它有助于可视化我之前的句子:

class Class
    def hi
        puts “Hi there”
    end
end

Test = Class.new(class Test
end)
Test.hi

我说得对吗?

1 个答案:

答案 0 :(得分:4)

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

[A, ...]

class << obj; ... end做的是它创建一个类B,其唯一的实例是obj,并将其放在obj的祖先层次结构中,以便祖先的层次结构为obj的班级成为:

[B, A, ...]

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