Warum wird die zweite ‚p arg‘ berichten die Instanz Foo?
-
07-07-2019 - |
Frage
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
Warum wird die zweite ‚p arg
‘ berichtet über die Foo-Instanz? Sollte es nicht nil
berichtet seit with_instance_eval
nicht self
zum Block ergibt?
Lösung
Offenbar in Rubin 1,8 instance_eval nur den Wert der Selbst nicht an seinen Empfänger innerhalb des Blocks ändern, es ergibt sich auch diesen Wert. In 1.9 ist dies nicht mehr der Fall (arg nil da sein wird), so dass das Verhalten nicht auf (ich bin auch ziemlich sicher, dass es undokumentiert) verlassen werden soll.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow