是JRuby的执行内核#__ method__破?(Is JRuby's implement

2019-10-21 06:45发布

这是的描述Kernel#__method__ 根据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__

Answer 1:

这可能是在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的是在所有类似,它也有可能是哪里出了问题可能在于。

无论哪种方式,有没有被替换找到相似之处__method__selfbindingobject_id ,或任何组合或它们的排列,所以这个问题肯定是本地化的用途__method__

UPDATE:转弯结尾

这是MRI 1.9.2一个已知的bug ,和JRuby的实施反映了该行为。



文章来源: Is JRuby's implementation of Kernel#__method__ broken?