Почему второй аргумент p сообщает об экземпляре Foo? - PullRequest
1 голос
/ 15 сентября 2009
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 блоку?

1 Ответ

4 голосов
/ 15 сентября 2009

Очевидно, что в ruby ​​1.8 instance_eval не только изменяет значение self внутри блока на его получателя, но и возвращает это значение. В версии 1.9 это уже не так (arg будет равен нулю), поэтому на поведение не следует полагаться (я также уверен, что оно недокументировано).

...