2014-11-17 6 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 

Когда я запускаю следующее с помощью МРТ 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, или это может быть строго ограничено использованием этих двух вместе. Посмотрите, что произойдет, если вы бросили 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's является t все подобное, также возможно, что именно там может возникнуть проблема.

В любом случае, нет никаких параллелей можно найти путем замены __method__ с self, binding, object_id, или любой комбинацией или перестановкой из них, так что вопрос, конечно, локализован в использование __method__.

UPDATE: Twist Ending

This was a known bug in MRI 1.9.2 и реализация JRuby в зеркало, что поведение.

+1

Разница в возвращаемом значении в зависимости от того, какой процесс передается в блок кода или нет, похоже, подтверждает, что это действительно ошибка. Я открыл билет [здесь] (https://github.com/jruby/jruby/issues/2212). –

Смежные вопросы