Pregunta

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 qué el segundo ' p arg ' informa la instancia de Foo? ¿No debería informar nil ya que with_instance_eval no cede self al bloque?

¿Fue útil?

Solución

Aparentemente, en ruby ??1.8 instance_eval no solo cambia el valor de self dentro del bloque a su receptor, sino que también produce ese valor. En 1.9 este ya no es el caso (arg será nulo allí), por lo que no se debe confiar en el comportamiento (también estoy bastante seguro de que no está documentado).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top