Почему второй 'p arg' сообщает об экземпляре Foo?

StackOverflow https://stackoverflow.com/questions/1428434

  •  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 там будет равен нулю), так что на это поведение не следует полагаться (я также почти уверен, что оно недокументировано).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top