Ruby 已定义?(超级)检查的奇怪行为
最近我遇到了一些奇怪的行为,使用Ruby 已定义?(超级)检查的奇怪行为,ruby,metaprogramming,Ruby,Metaprogramming,最近我遇到了一些奇怪的行为,使用defined?操作符检查super关键字是否可以在当前上下文中使用。通常它可以正常工作,但是当我尝试组合定义的?超级用一点元编程检查一下,它给了我意想不到的结果 显示和描述更容易,因此这里有一个提炼的示例来说明问题: class A; def self.def_f!; singleton_class.send(:define_method, :f) { defined? super } end end class AA < A; end
defined?
操作符检查super
关键字是否可以在当前上下文中使用。通常它可以正常工作,但是当我尝试组合定义的?超级
用一点元编程检查一下,它给了我意想不到的结果
显示和描述更容易,因此这里有一个提炼的示例来说明问题:
class A;
def self.def_f!;
singleton_class.send(:define_method, :f) { defined? super }
end
end
class AA < A; end
(A.f
没有super和AA.f
发送到A.f
,所以到目前为止一切正常,但是…)
谁能给我解释一下最后一行吗A.f
没有super方法,那么为什么它返回“super”
而不是nil
?是虫子吗
(我在1.9.2和1.9.3中试过,结果相同)
UPD:我在Ruby bugtracker上打开了一张罚单:是的,
define\u方法
有一些怪癖,这不是defined?(super)
的问题,而是define\u方法
的问题。话虽如此,每当我使用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
模块M;
迪夫!
单件物品的估价为零
AA.def#f!#在AA类中定义自己的.f方法
p AA.f#=>“超级”
p A.f=>零
至于为什么它是这样工作的,我对Ruby的源代码没有足够的经验去了解,也许有人知道的比我多,可以插话。但出于实际目的,对字符串求值对我来说一直都很有效。好的,所以@Niklas是对的,我向Ruby bugtracker报告了这个问题,他们确认并修复了这个错误:
据我所知,修复程序将包含在ruby 2.0.0中。查看ruby源代码后,我认为您在这里发现了一个真正的bug。你应该向Ruby bugtracker报告。如果你这样做了,别忘了在这里发布问题的链接<代码>:)@NiklasB。完成:我仍然认为问题更多地在于
定义?(super)
,但感谢您的解决方法。感谢您的报告和后续行动!
AA.def_f! # define its own .f method in the AA class
AA.f # => "super"
A.f # => "super" # WHY???
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