2010-12-18 18 views
12

Ich habe ein seltsames Verhalten der Variablen in for-Schleifen bemerkt. Es ist nicht wirklich ein Problem, aber es stört mich sehr.
Eigentlich habe ich erstellt zwei Schleifen auf diese Weise:For-Schleife variabler Bereich Verwirrung

for (var i:uint; i<19; i++) SomeFunction (i); 
for (var i:uint; i<26; i++) SomeOtherFunction (i); 

Was ich Warnung war eine Zusammenstellung erhalten:
Warning: Duplicate variable definition.

Diese Warnung hat mich wirklich überrascht. So etwas ist mir in anderen Sprachen nie passiert.
Es scheint, dass die i Variable in den Bereich gelangt, der in der Hierarchie höher ist und außerhalb des Schleifenblocks verfügbar wird. Ich habe auch versucht, den Loop-Block in einer geschweiften Klammer zu umarmen, aber es hat nichts geändert.
Warum passiert das? Es ist normal? Ist es möglich, es zu vermeiden? Für jetzt habe ich nur verschiedene Namen für die beiden Variablen, aber das ist keine echte Lösung, denke ich. Ich würde gerne die i -named Variable in den meisten meiner For-Schleifen verwenden.

Antwort

14

ja eine schlechte Art und Weise können denken, das ist, ist der Schleifenschritt Variable im Umfang der Schleifen Eltern, nicht innerhalb der Schleife selbst. Dies ist beabsichtigt, für Beispiele wie folgt aus:

public function getPositionOfValue (value:String) : int 
{ 
    for (var i:int = 0; i < someArray; i++) 
    { 
     if (someArray[i] == value) 
     { 
      break; 
     } 
    } 

    return i; 
} 

das Sie den Wert von i zugreifen können, sobald die Schleife beendet ist. Es gibt viele Fälle, in denen dies sehr nützlich ist.

Was sollten Sie in den Fällen tun, wo man mehrere Schleifen im gleichen Umfang haben, ist var die i außerhalb der Schleifen:

public function getPositionOfValue (value:String) : int 
{ 
    var i:int; 

    for (i = 0; i < 15; i++) 
    { 
     //do something 
    } 

    for (i = 0; i < 29; i++) 
    { 
     //do something else 
    } 

    return i; 
} 

Sie dann Ihre Warnung loswerden. Die andere Sache, die Sie beachten sollten, ist, Ihre Schleifeninkrementvariablen etwas beschreibender zu nennen.

Update: Zwei weitere Dinge zu beachten:

1) Sie sollten nicht uints verwenden, außer für Dinge wie Farben und Orte, wo Flex eine uint erwartet. Sie sind langsamer als int zu verwenden.Quelle] 1 Update: es sieht wie folgt aus nicht mehr der Fall in neueren Versionen des Flash Player sein kann: source

2), wenn Sie var innerhalb einer Schleife Deklaration eine Schleife Schritt Variable, wollen Sie sicherstellen, dass Sie setze es auf den richtigen Initialisierungswert, normalerweise auf 0. Du kannst etwas schwer finden, um Bugs aufzuspüren, wenn du nicht tust.

+0

Vielen Dank für die sinnvolle Antwort. :) BTW: 1) Ich wusste nicht, dass 'Uint' langsamer ist. Danke, es kann mir in Zukunft helfen. 2) Ich weiß, aber ich habe gelesen, dass, wenn ein "int" oder "uint" nicht initialisiert ist, sein Wert immer 0 ist. – rhino

+0

kein Problem, froh zu helfen. Re: Deine Antwort auf 2), das ist richtig, aber wenn du dein i außerhalb der Schleifen variierst, wird deine zweite Schleife jetzt den Wert der vorherigen Schleife haben. also sei vorsichtig. Nach meiner Erfahrung ist es immer besser, explizit zu sein. –

3

Deklarieren Sie die Variable i außerhalb der Schleifen, um dies zu vermeiden. Solange Sie es zurücksetzen (i = 0), können Sie es immer noch in allen Schleifen verwenden.

var i : uint; 
for (i=0; i<19; i++) SomeFunction(i); 
for (i=0; i<26; i++) SomeOtherFunction(i); 
6

Wie erwähnt here hat AS3 globalen und lokalen Bereich und das ist es.

Es wird kein Block-Level-Scoping (oder For-Level) durchgeführt. Beim Hochfahren können Sie sogar Variablen schreiben, bevor Sie sie definieren. Das ist das Bit, das meinen Kopf

Frühe Versionen von Visual C hatte diesen Fehler in :-) tun würde, auf alle Arten von wunderbaren flippigen Makro Abhilfen führenden, aber dies ist kein Fehler in AS3, arbeitet es wie vorgesehen. Sie können Ihren Code entweder darauf beschränken, die Deklaration nur in der ersten for zu haben oder die Deklaration außerhalb aller for-Anweisungen zu verschieben.

So oder so, es ist eine Frage der Annahme, dass die Sprache eine Art und Weise funktioniert, auch wenn Sie :-)