这是对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__的另一种解释?

最佳答案

这可能是JRuby实现__method__的缺陷,也可能是实现define_method的缺陷,或者可能严格限制两者的一起使用如果使用Proc运算符将&对象投射到块中,会发生什么情况:

DEFINITION = proc { __method__ }

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

o = C.new

现在在核磁共振成像中,和以前一样:
o.one  #=> :one
o.two  #=> :two

但是,在JRuby中,它是固定的:
o.one  #=> :one
o.two  #=> :two

考虑到MRI的define_method的内部实现,其中包括Proc参数和块参数的处理,如果JRuby的完全相似,也可能是问题所在。
不管怎样,用__method__selfbinding或它们的任何组合或排列替换object_id都找不到并行,因此问题肯定局限于__method__的使用。
更新:扭曲结束
This was a known bug in MRI 1.9.2,JRuby的实现反映了这种行为。

关于ruby - JRuby的Kernel #__ method__实现是否中断?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26966547/

10-12 14:25