JRuby的Kernel #__方法实现了吗?

这是根据Ruby-Doc.org对Kernel#__method__的描述(强调添加):

以符号forms返回当前方法定义的名称。 如果在方法之外调用,则返回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实现中的错误,或者它可能严格限于将两者结合使用。 看看如果使用&运算符将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参数vs块参数,如果JRuby完全相似,那么问题也可能存在。

无论哪种方式,通过将selfbindingobject_id或它们的任何组合或排列替换为__method__ ,都没有找到__method__ ,因此问题肯定局限于__method__使用。

更新:扭曲结束

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