Не работает ли JRuby реализация Kernel #__ method__?

Это описание 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__?


person Gabriel de Oliveira    schedule 17.11.2014    source источник
comment
Посмотрите, что происходит в обоих контекстах, когда вы запускаете DEFINITION.call.   -  person user513951    schedule 17.11.2014
comment
В обоих случаях возвращаемое значение - :two.   -  person Gabriel de Oliveira    schedule 17.11.2014
comment
возможно, просто сообщите об этом как об ошибке JRuby (совместимости) ...   -  person kares    schedule 17.11.2014


Ответы (1)


Это может быть дефект в реализации __method__ в JRuby, или ошибка в реализации 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__ на self, binding, object_id или любую их комбинацию или перестановку, поэтому проблема определенно локализована для использования __method__.

ОБНОВЛЕНИЕ: конец Twist

Это была известная ошибка в MRI 1.9.2., и реализация JRuby отражает это поведение.

person user513951    schedule 17.11.2014
comment
Разница в возвращаемом значении в зависимости от того, передается ли процесс в блок кода или нет, похоже, подтверждает, что это действительно ошибка. Я открыл билет здесь. - person Gabriel de Oliveira; 18.11.2014