什么是<<在这种背景下?

时间:2013-04-29 23:17:46

标签: ruby class metaclass

我在这里编写本教程: http://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/39-ruby-s-object-model/lessons/131-singleton-methods-and-metaclasses

课程是关于类/元类的,但它们使用的是我不熟悉的语法。请参阅使用<<以下

class Object
  def metaclass
    class << self
      self
    end
  end
end


a=Object.new
p a.metaclass.new

我知道def metaclass是一种方法,但class << self是什么意思?它有一个相应的end块,但我仍然不清楚这是做什么的

(注意:上述练习的要点只是表明你无法实例化一个元类 - 我明白,在这种情况下,我只是无法绕过那个&lt;&lt;运算符。

谢谢!

1 个答案:

答案 0 :(得分:2)

class << self打开self的单例类,以便可以为当前self对象重新定义方法。

让我们看一个特定的例子:

 s = String.new("abc")
 s.metaclass
   => "#<Class:#<String:0x0000010117e5d8>>" 

让我们仔细看看这里发生的事情:

  • metaclass的定义中,self引用当前实例,在此示例中为字符串“abc”。
  • 此示例中的
  • class << self等同于class << "abc",它打开了该给定实例的单例类,在本例中为String“abc”。
  • 然后在当前实例的开放类中返回self - 开放的类在示例中为类String

通常,metaclass的定义打开给定实例/对象的类的类定义,然后返回该类名。

在Yehuda Katz的文章“Metaprogramming in Ruby: It’s All About the Self”中可以找到更详细的“自我”看法。

我还推荐Pragmatic Programmers on The Ruby Object Model and Metaprogramming的屏幕播放系列。