这是的描述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__
?
这可能是在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__
与self
, binding
, object_id
,或任何组合或它们的排列,所以这个问题肯定是本地化的用途__method__
。
UPDATE:转弯结尾
这是MRI 1.9.2一个已知的bug ,和JRuby的实施反映了该行为。