Why isn't the eigenclass equivalent to self.class, when it looks so similar?
我错过了某个地方的备忘录,我希望你能解释一下这个。
为什么对象的本征类与
1 2 3 4 5 6 7 8 9 10 | class Foo def initialize(symbol) eigenclass = class << self self end eigenclass.class_eval do attr_accessor symbol end end end |
我的逻辑系列将特征类与
因此,在对象类的引用中,返回
我只是困惑吗? 或者,这是Ruby元编程的偷偷摸摸的伎俩吗?
1 2 3 4 5 6 7 | class Foo class << self def a print"I could also have been defined as def Foo.a." end end end |
这有效,相当于
现在让我们看一个不同的例子:
1 2 3 4 5 6 7 8 9 10 11 | str ="abc" other_str ="def" class << str def frob return self +"d" end end print str.frob # =>"abcd" print other_str.frob # => raises an exception, 'frob' is not defined on other_str |
这个例子和最后一个例子相同,但最初可能很难说。
现在我们已经准备好了解您的原始示例。在
1 2 3 4 5 6 | f1 = Foo.new(:weasels) f2 = Foo.new(:monkeys) f1.weasels = 4 # Fine f2.monkeys = 5 # Also ok print(f1.monkeys) # Doesn't work, f1 doesn't have a 'monkeys' method. |
希望这可以帮助。
最简单的答案:本征类无法实例化。
1 2 3 4 5 6 7 8 | class F def eigen class << self self end end end F.new.eigen.new #=> TypeError: can't create instance of virtual class |
Yehuda Katz在解释"Ruby中的元编程:一切都是关于自我"中的细微之处方面做得非常出色