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?

War es hilfreich?

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
scroll top