最近我遇到一些奇怪的行为,defined?
运营商用于检查是否super
关键字可以在当前的情况下使用。通常它工作正常,但是当我试图将defined? super
检查与一些元编程相结合时,它给了我意想不到的结果。奇怪的行为定义?(超)检查
它更容易表现出那么来形容,所以这里是一个蒸馏的例子来说明这个问题:
class A;
def self.def_f!;
singleton_class.send(:define_method, :f) { defined? super }
end
end
class AA < A; end
(A
和AA
类都有.def_f!
类的方法)
A.def_f!
A.f # => nil
AA.f # => nil
(A.f
没有超级和AA.f
发送到A.f
,所以一切正常,但...)
AA.def_f! # define its own .f method in the AA class
AA.f # => "super"
A.f # => "super" # WHY???
任何人都可以解释我最后一行吗? A.f
没有超级方法,那么为什么它返回"super"
而不是nil
?这是一个错误吗?
(我在1.9.2和尝试了1.9.3-相同的结果)
UPD:我开了票在Ruby错误追踪:http://bugs.ruby-lang.org/issues/6644
看过Ruby源代码后,我想你在这里找到了一个真正的bug。你应该将它报告给Ruby错误追踪器。 –
如果你这样做,不要忘记在这里发布一个链接到问题! ':)' –
@NiklasB。完成:http://bugs.ruby-lang.org/issues/6644 – Alexis