¿Por qué el segundo 'p arg' informa la instancia de Foo?
-
07-07-2019 - |
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?
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