JRuby对内核#__method__的实现坏了吗?



这是根据 Ruby-Doc.org 对Kernel#__method__的描述(着重号是加的):

当前方法定义处的名称作为符号返回。如果在方法外部调用,则返回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__的不同解释?

可能是

JRuby实现__method__的缺陷,也可能是define_method实现中的bug,也可能严格限于两者一起使用。看看如果使用 & 运算符将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的完全相似,那么问题也可能出在哪里。

无论哪种方式,用selfbindingobject_id或它们的任何组合或排列替换__method__都没有相似之处,所以这个问题肯定局限于__method__的使用。

更新:扭曲结局

这是MRI 1.9.2中的一个已知错误,JRuby的实现反映了该行为。

相关内容

  • 没有找到相关文章

最新更新