Pergunta

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

Por que o segundo 'p arg' denunciar a instância Foo? ele não deve relatar nil desde with_instance_eval não produz self ao bloco?

Foi útil?

Solução

Aparentemente, no Ruby 1.8 instance_eval não só mudam o valor da auto dentro do bloco para o seu receptor, ele também produz esse valor. Em 1.9 já não é este o caso (arg será nula lá), de modo que o comportamento não deve ser invocado (estou também bastante certeza de que está em situação irregular).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top