Wenn ich:
%Vor% Ich bekomme 1 2 1 2
, während ich 1 2 2 3
erwartet habe. Warum verliert i
seine Zuweisung, wenn die Schleife neu gestartet wird? Es verhält sich wie erwartet, wenn die Zuweisung außerhalb der Schleife erfolgt, also denke ich, dass es mit dem Bereich zu tun hat, aber ich habe nicht erkannt, dass Schleifen ihre eigenen Bereiche haben. Kann jemand klären?
Update: Danke für die Hilfe zu diesem Thema. Ein Teil meiner Verwirrung rührte von dem Kommen zu Ruby von Python her, das keinen Blockbereich hat (denke ich).
Sehen Sie sich den folgenden Code an:
%Vor%Ausgabe:
%Vor% Das bedeutet, dass bei jeder Iteration ein neuer Bereich erstellt wird und i
nur diesem Bereich bekannt ist; was durch nil
und "local-variable"
bewiesen wird.
Jetzt i
wird außerhalb von block
erstellt und sieht die Ausgabe (kein nil
kommt):
Ausgabe:
%Vor% Um mehr über ||=
zu erfahren, schauen Sie What Ruby’s ||= (Double Pipe / Or Equals) Really Does
Ich weiß nicht, worauf Ihre Erwartungen beruhen. Wenn Sie denken, was Sie denken, sollte es 1 2 2 3
sein. Sie können dies erreichen, indem Sie die Variable i
außerhalb des Blocks deklarieren.
Dann schließt der Block diese Variable (closure) und verwendet sie. Ohne Abschluss ist i
lokal für den Block und ist jedes Mal neu.
Es ist nicht die "Schleife", die einen Bereich hat. Es ist der Block. Ja, ein Block ist ein lokaler Bereich.
Wenn eine Variable nicht als lokal für den Block verstanden werden soll, muss sie außerhalb des Blocks vorher existieren. Sogar das Setzen von i
auf Null in einer vorhergehenden Zeile würde dies tun.
(Aber Ihre Erwartung von 1 2 3 4
wird immer noch nicht ganz erfüllt ...!)
Sie können Spaß damit haben. Sagen Sie beispielsweise, dass Sie auf den Bereich innerhalb des Blocks zugreifen möchten.
%Vor%Dies ist wichtig, weil es Entwicklern ermöglicht, die Kapselung eines Blocks im Grunde wegzublasen, und sollte daher mit Vorsicht verwendet werden.
Ruby-Schleife wie x.times
lokalen Bereich erstellen, so dass Variablen innerhalb dieser Schleife eingeführt werden, lokal sind und nach dem Erreichen des Blockendes zerstört werden. Deshalb erhalten Sie nicht das erwartete Ergebnis.
Wenn Sie in ruby eine Schleife ohne lokale Bereichsdefinition verwenden möchten, können Sie for
oder while
loop verwenden, die keinen lokalen Bereich erstellen, aber Ihre lokale Variable i
bleibt auch nach der Schleife verfügbar.
Drucken Sie 1 2 2 3
als Ihr erwartetes Ergebnis. Wenn wir nun über die Schleifenalterung laufen, wird das Ergebnis 3 4 4 5
ergeben. Für zusätzliche Informationen arbeiten while
und for
gleich (Bereich weniger & amp; print 1 2 2 3
), andererseits arbeiten each
, x.upto(y)
und x.times
gleich (erstellen Sie den lokalen Bereich und drucken Sie 1 2 1 2
)
Tags und Links ruby block variable-assignment