【发布时间】:2012-06-24 20:17:20
【问题描述】:
最近我遇到了一些奇怪的行为,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 bugtracker 上开了一张票:http://bugs.ruby-lang.org/issues/6644
【问题讨论】:
-
查看 Ruby 源代码后,我认为您在这里发现了一个真正的错误。您应该将其报告给 Ruby bugtracker。
-
如果您这样做了,请不要忘记在此处发布指向该问题的链接!
:) -
@NiklasB。完成:bugs.ruby-lang.org/issues/6644
标签: ruby metaprogramming