10

最近,我遇到了一些defined?用于检查super关键字是否可以在当前上下文中使用的运算符的奇怪行为。通常它工作得很好,但是当我尝试将defined? 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.fdispatch to 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

4

2 回答 2

2

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

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

于 2012-07-14T12:17:02.920 回答
1

是的,有一些怪癖define_method,这defined?(super)真的不是问题,但更多的是define_method. 话虽如此,每当我遇到像这样的边缘情况时define_method,我通常只是最终评估一串 Ruby 代码,它总是按预期工作。

module M;
  def def_f!
    singleton_class.class_eval <<-RUBY
      def f
        defined?(super)
      end
    RUBY
  end
end

class A; extend M; end
class AA < A; end

A.def_f!

p A.f  # => nil
p AA.f # => nil

AA.def_f! # define its own .f method in the AA class

p AA.f # => "super"
p A.f # => nil

至于为什么它会这样工作,我对 Ruby 的源代码没有足够的经验来知道,也许比我了解更多的人可以插话。但出于实际目的,评估字符串一直对我有用。

于 2012-06-24T22:25:31.030 回答