2014-11-17 8 views
1

이 설명이다 Kernel#__method__according to Ruby-Doc.org (강조 추가)JRuby의 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__의 다른 해석입니까?

+0

'DEFINITION.call'을 실행할 때 두 문맥 모두에서 어떤 일이 발생하는지 확인하십시오. –

+0

두 경우 모두 반환 값은': two '입니다. –

+0

아마도 JRuby (호환성) 버그로보고하면됩니다 ... – kares

답변

4

JRuby가 구현 한 __method__에 결함이 있거나 define_method 구현의 버그 일 수 있으며 두 개를 함께 사용하면 엄격하게 제한 될 수 있습니다. 이전과 같이, MRI 지금

DEFINITION = proc { __method__ } 

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

o = C.new 

: 당신이 & 연산자를 사용하여 블록에 Proc 개체를 캐스팅하면 어떻게되는지 봐 JRuby를에,

o.one #=> :one 
o.two #=> :two 

그러나, 고정 된 것 :

o.one #=> :one 
o.two #=> :two 

define_method의 내부 구현을 고려하면 인수 대 블록 인수를 처리하는 것을 포함하며, JRuby 's가 모두 비슷하다. 문제가있는 곳이기도하다.

어느 쪽이든, __method__으로 대체함으로써 찾을 수없는 평행선이없는 self, binding, object_id, 또는 임의의 조합 또는 이들의 치환, 문제가 확실히 __method__의 용도에 국한되도록.

UPDATE :

This was a known bug in MRI 1.9.2 종료 트위스트, 그리고 JRuby에서의 구현은 그 동작을 반영한다.

+1

코드 블록에 캐스트되는 proc에 따라 반환 값의 차이가 있는지 여부가 실제로 버그인지 확인하는 것 같습니다. 나는 티켓을 열었다. (https://github.com/jruby/jruby/issues/2212). –