4

我正在这里学习本教程: http ://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/39-ruby-s-object-model/lessons/131-singleton-methods-and -元类

这节课是关于类/元类的,但它们使用的是我不熟悉的语法。请看下面<<的使用

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


a=Object.new
p a.metaclass.new

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

(注意:上述练习的重点只是表明您无法实例化元类——我理解,在这种情况下,我只是难以理解 << 运算符。

谢谢!

4

1 回答 1

2

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

让我们看一个具体的例子:

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

让我们仔细看看这里发生了什么:

  • 在 的定义中metaclassself指的是当前实例,在这个例子中是字符串“abc”。
  • class << self在此示例中,等效于class << "abc"打开给定实例的单例类,在本例中为字符串“abc”。
  • 然后它self在当前实例的打开的类中返回——打开的类在示例中是 class String

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

可以在 Yehuda Katz 的文章“ Ruby 中的元编程:一切都是关于自我”中找到对“自我”的更详细了解。

我还推荐Pragmatic Programmers 在 The Ruby Object Model and Metaprogramming 上的截屏系列。

于 2013-04-29T23:28:07.030 回答