Perché il secondo 'p arg' riporta l'istanza di Foo?
-
07-07-2019 - |
Domanda
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
Perché il secondo ' p arg
' riporta l'istanza di Foo? Non dovrebbe riportare nil
poiché with_instance_eval
non restituisce self
al blocco?
Soluzione
Apparentemente in ruby ??1.8 instance_eval non cambia solo il valore di sé all'interno del blocco al suo ricevitore, ma produce anche quel valore. In 1.9 questo non è più il caso (arg sarà nulla qui), quindi quel comportamento non dovrebbe essere invocato (sono anche abbastanza sicuro che non sia documentato).
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow