define_method демонстрирует следующее поведение:Рубин - define_method и закрытие
class TestClass
def exec_block(&block) ; yield ; end
end
TestClass.new.send(:exec_block) do ; puts self ; end
# -> main
TestClass.send(:define_method, :bing) do ; puts self ; end
TestClass.new.bing
# -> <TestClass:...>
То, что я не понимаю, что блок передается define_method должен быть замыкание. Как таковой он должен (по крайней мере, согласно моему пониманию) зафиксировать значение self
как main
, как выставлено при звонке exec_block
.
Я понимаю, что блок станет телом метода, но я не понимаю причину поведения. Почему блок оценивает разные вещи при использовании с различными методами?
Как я могу воспроизвести поведение блока с помощью define_method
для других методов? например, как я мог написать exec_block
, чтобы он выводил <TestClass:...>
вместо `main '?
Как вы объясните поведение exec_block? Он должен печатать 'main', если' self' не был захвачен. Или мне что-то не хватает? – Norswap
Извините, я написал противоположное тому, что я знаю. Дело в том, что оно печатает 'main', если оно не было захвачено, оно должно печатать' ', что не так. –
Norswap
Ницца! Но если я динамически связан, не должен ли он печатать 'TestClass' - это случай' exec_block'? Поскольку блок вызывается 'yield whitin' TestClass'. На самом деле, я не совсем понимаю, что происходит, когда Ruby читает определение блока. Например, сохраняется ли какая-либо информация о 'self', например? (Кроме того, если вы суммируете свои комментарии в ответе, я бы согласился на это.) – Norswap