Ist 'Ausbeute selbst" das gleiche wie instance_eval?
Ist, gibt es einen Unterschied, wenn Sie definieren Foo mit instance_eval: . . .
class Foo
def initialize(&block)
instance_eval(&block) if block_given?
end
end
. . . oder mit 'yield self':
class Foo
def initialize
yield self if block_given?
end
end
In jedem Fall, dass Sie dies tun können:
x = Foo.new { def foo; 'foo'; end }
x.foo
So 'yield self
' bedeutet, dass der block nach Foo.neues wird immer ausgewertet, die im Rahmen der Foo-Klasse.
Ist das richtig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deine beiden code-Stücken, die die unterschiedlichsten Dinge tun. Durch die Verwendung instance_eval du bist der Bewertung der block in den Kontext des Objekts. Dies bedeutet, dass mit def definieren Methoden auf das Objekt. Es bedeutet auch, dass der Aufruf einer Methode ohne Empfänger in den block, rufen Sie es auf Ihrem Objekt.
Wenn was selbst Sie übergeben haben selbst als argument für den block, aber da dein block nimmt keine Argumente, es wird einfach ignoriert. Also in diesem Fall das nachgeben selbst macht das gleiche wie nachgeben nichts. Die
def
hier verhält sich genau wie eindef
außerhalb des Blocks würde, was selbst nicht wirklich was ändern, definieren Sie die Methode auf. Was Sie tun können, ist:Den Unterschied zu instance_eval sein, dass Sie zum angeben der Empfänger ausdrücklich.
Bearbeiten, um zu klären:
In der version mit Ertrag -, obj -, die in dem block wird das Objekt, das sich ergab, in diesem Fall wird die neu erstellte Foo-Instanz. Während selbst die haben den gleichen Wert, den es hatte außerhalb des Blocks. Mit der instance_eval version
self
innerhalb des Blocks werden die neu erstellten Foo-Instanz.Sind Sie anders.
yield(self)
ändert nicht den Wert derself
im inneren des Blocks, währendinstance_eval(&block)
tut.p arg
druckennil
, nicht#<Foo:0x100124b10>
.Du nur ablegen können, die selbst Stichwort
Update aus den Kommentaren
Mit Ertrag es ist ein bisschen neu für meinen Geschmack, speziell, wenn draußen irb.
Allerdings gibt es einen großen und signifikanten Unterschied zwischen instance_eval Ansatz und Ertrag Ansatz, check das snippet:
Überprüfen Sie diese auch:
Wie Sie sehen können, der Unterschied ist, dass erstere ist das hinzufügen einer singleton-Methode foo auf das Objekt wird initialisiert, während das spätere hinzufügen einer privaten Methode, um alle Instanzen der Object-Klasse.