Umfang einer lokalen Variablen in einem Block

7

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).

    
ivan 15.05.2013, 17:48
quelle

6 Antworten

9

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):

%Vor%

Ausgabe:

%Vor%

Um mehr über ||= zu erfahren, schauen Sie What Ruby’s ||= (Double Pipe / Or Equals) Really Does

    
Arup Rakshit 15.05.2013, 17:53
quelle
10

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.

%Vor%

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.

    
Sergio Tulentsev 15.05.2013 17:51
quelle
3

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 ...!)

    
matt 15.05.2013 17:50
quelle
2

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.

    
Nathan Lilienthal 15.05.2013 20:17
quelle
1

Einfache Antwort ist, dass Sie die Variable i bei jeder Iteration neu stancieren und auf den Wert eins zurückgesetzt werden.

    
lrl 15.05.2013 20:46
quelle
0

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.

%Vor%

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 )

    
quelle

Tags und Links