定义?(超级)检查的奇怪行为

Ale*_*xis 10 ruby metaprogramming

最近我遇到了一些奇怪的行为,defined?用于检查super关键字是否可以在当前上下文中使用.通常它工作正常,但当我尝试将defined? super检查与一点点元编程相结合时,它给了我意想不到的结果.

然后展示更容易描述,所以这里有一个举例说明问题:

class A; 
  def self.def_f!; 
    singleton_class.send(:define_method, :f) { defined? super }
  end
end
class AA < A; end
Run Code Online (Sandbox Code Playgroud)

(AAA类都有.def_f!类方法)

A.def_f!

A.f  # => nil
AA.f # => nil
Run Code Online (Sandbox Code Playgroud)

(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???
Run Code Online (Sandbox Code Playgroud)

谁能解释我最后一行?A.f没有超级方法,为什么它返回"super"而不是nil?这是一个错误吗?

(我在1.9.2和1.9.3中尝试过 - 相同的结果)

UPD:我在Ruby bugtracker上开了一张票:http://bugs.ruby-lang.org/issues/6644

Ale*_*xis 2

好吧,@Niklas 是对的,我向 Ruby bugtracker 报告了这个问题,他们确认并修复了这个错误:https ://bugs.ruby-lang.org/issues/6644 。

据我了解,该修复将包含在 ruby​​ 2.0.0 中。