Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 已定义?(超级)检查的奇怪行为_Ruby_Metaprogramming - Fatal编程技术网

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