最近,我遇到了一些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
没有 super 和AA.f
dispatch to 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 bugtracker 上开了一张票:http: //bugs.ruby-lang.org/issues/6644