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)
(A和AA类都有.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
| 归档时间: |
|
| 查看次数: |
615 次 |
| 最近记录: |