JRuby的内核#__方法的实现是否被破坏?

时间:2014-11-17 06:09:03

标签: ruby jruby defects

这是Kernel#__method__ according to Ruby-Doc.org的说明(强调添加):

  

以符号形式返回当前方法定义的名称。如果在方法之外调用,则返回nil

现在考虑以下代码段:

DEFINITION = proc { __method__ }

class C
  define_method :one, DEFINITION
  define_method :two, DEFINITION
end

o = C.new

当我使用MRI v1.8.7运行以下内容时,我得到了预期的结果:

o.one  #=> :one
o.two  #=> :two

然而,当我使用JRuby 1.7+运行相同的代码时(我没有测试过以前的版本):

o.one  #=> :two
o.two  #=> :two

这可能被视为JRuby实现中的缺陷还是只是对Kernel#__method__的不同解释?

1 个答案:

答案 0 :(得分:4)

这可能是JRuby的__method__实现中的缺陷,或者它可能是define_method实现中的错误,或者它可能严格限于使用这两个一起。看看如果使用Proc运算符将&对象转换为块,会发生什么:

DEFINITION = proc { __method__ }

class C
  define_method :one, &DEFINITION
  define_method :two, &DEFINITION
end

o = C.new

现在在MRI中,和以前一样:

o.one  #=> :one
o.two  #=> :two

然而,在JRuby,它已修复:

o.one  #=> :one
o.two  #=> :two

考虑到MRI define_method的内部实现,其中包括Proc参数与块参数的处理,如果JRuby完全相似,那么它是这也可能是问题所在。

无论哪种方式,将__method__替换为selfbindingobject_id或其任意组合或排列,都无法找到相似之处,因此问题当然是本地化使用__method__

更新:扭曲结束

This was a known bug in MRI 1.9.2,JRuby的实现反映了这种行为。