课程是关于类/元类的,但它们使用的是我不熟悉的语法。请参阅使用<<以下
class Object
def metaclass
class << self
self
end
end
end
a=Object.new
p a.metaclass.new
我知道def metaclass
是一种方法,但class << self
是什么意思?它有一个相应的end
块,但我仍然不清楚这是做什么的
(注意:上述练习的要点只是表明你无法实例化一个元类 - 我明白,在这种情况下,我只是无法绕过那个&lt;&lt;运算符。
谢谢!
答案 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的屏幕播放系列。