ruby - defined?(super) 检查的奇怪行为

标签 ruby metaprogramming

最近我发现 defined? 运算符有一些奇怪的行为,用于检查 super 关键字是否可以在当前上下文中使用。通常它工作正常,但是当我尝试组合定义的 时? super 用一点元编程检查,它给了我意想不到的结果。

显示比描述更容易,所以这里是一个提炼的例子来说明问题:

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

(AAA 类都有.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/

相关文章:

ruby - 检查 ruby 中的两个范围是否重叠

ruby - 动态获取变量值

ruby - 我们可以一起使用 selenium-webdriver 和 nokogiri 吗?

Ruby - 如果变量不存在,我该如何处理它

ruby - 文件系统爬虫 - 迭代错误

php - 在数据库中存储可变数量的值

ruby - 为什么我不能在初始化中使用 attr_accessor?

Ruby:给类中的方法起别名

c# - AOP 与元编程

c++ - 是否可以在部分特化中模拟默认模板参数?