最近我发现 defined?
运算符有一些奇怪的行为,用于检查 super
关键字是否可以在当前上下文中使用。通常它工作正常,但是当我尝试组合定义的 时? 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
调度到 A.f
,所以到目前为止一切正常,但是...)
AA.def_f! # define its own .f method in the AA class
AA.f # => "super"
A.f # => "super" # WHY???
谁能解释一下最后一行? A.f
没有super 方法,那为什么它返回"super"
而不是nil
?这是一个错误吗?
(我在 1.9.2 和 1.9.3 中都试过了——结果一样)
UPD:我在 Ruby bugtracker 上开了一张票:http://bugs.ruby-lang.org/issues/6644
最佳答案
好的,@Niklas 是对的,我向 Ruby bugtracker 报告了这个问题,他们确认并修复了错误:https://bugs.ruby-lang.org/issues/6644 .
据我所知,修复将包含在 ruby 2.0.0 中。
关于ruby - defined?(super) 检查的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11180909/