Почему второй 'p arg' сообщает об экземпляре Foo?
-
07-07-2019 - |
Вопрос
class Foo
def with_yield
yield(self)
end
def with_instance_eval(&block)
instance_eval(&block)
end
end
f = Foo.new
f.with_yield do |arg|
p self
# => main
p arg
# => #<Foo:0x100124b10>
end
f.with_instance_eval do |arg|
p self
# => #<Foo:0x100124b10>
p arg
# => #<Foo:0x100124b10>
end
Почему второй 'p arg
- сообщить о случае Foo?Разве это не должно сообщать nil
с тех пор как with_instance_eval
не поддается self
в блок?
Решение
По-видимому, в ruby 1.8 instance_eval не только изменяет значение self внутри блока на его приемник, но и возвращает это значение.В 1.9 это уже не так (arg там будет равен нулю), так что на это поведение не следует полагаться (я также почти уверен, что оно недокументировано).
Не связан с StackOverflow