2010-12-18 16 views
12

Zauważyłem dziwne zachowanie zmiennych w pętlach for. To naprawdę nie problem, ale bardzo mi to przeszkadza.
Właściwie mam dwie pętle utworzone w ten sposób:Zamieszanie zakresów zmiennych dla pętli

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

Co dostałam było ostrzeżenie kompilacja:
Warning: Duplicate variable definition.

Ostrzeżenie to naprawdę mnie zaskoczyło. Nic takiego nigdy mi się nie przydarzyło w innych językach.
Wydaje się, że zmienna i dostaje się do zakresu, który jest wyższy w hierarchii i staje się dostępny poza blokiem pętli. Próbowałem też objąć blok pętli w nawiasach klamrowych, ale nic to nie zmieniło.
Dlaczego tak się dzieje? Jest to normalne? Czy można tego uniknąć? Na razie właśnie ustawiłem różne nazwy dla obu zmiennych, ale to nie jest prawdziwe rozwiązanie, które myślę. Bardzo chciałbym użyć zmiennej nazwanej i w większości pętli for-loop.

Odpowiedz

14

tak, zmienna pętli przyrost jest w zakresie Pętle rodzica, nie w samej pętli. Jest to zamierzone, przykładów takich jak ten:

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

    return i; 
} 

ten pozwala na odczytanie wartości kiedyś pętla jest skończona. Istnieje wiele przypadków, w których jest to bardzo przydatne.

Co należy zrobić w przypadku, gdy masz wiele pętli wewnątrz tego samego zakresu jest var I poza pętlami:

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; 
} 

wtedy pozbyć się ostrzeżenia. Inną rzeczą, którą należy wziąć pod uwagę, jest nadanie nazwy zmiennej pętli przyrostowej czegoś bardziej opisowego.

Aktualizacja: Dwie inne rzeczy do rozważenia:

1) nie należy używać uints wyjątkiem rzeczy jak kolory i miejsc, gdzie Flex oczekuje uint. Są wolniejsze niż int do użycia.Źródło] 1 Aktualizacja: wygląda to może już nie być w przypadku nowszych wersji odtwarzacza Flash: source

2) gdy var zmienna pętli przyrost wewnątrz deklaracji pętli, chcesz się upewnić, że ustaw ją na prawidłową wartość inicjalizacji, zwykle 0. Możesz dostać kilka trudnych do zlokalizowania błędów, jeśli nie.

+0

Dziękuję za znaczącą odpowiedź. :) BTW: 1) Nie wiedziałem, że 'uint' jest wolniejsze. Dzięki, może mi to pomóc w przyszłości. 2) Wiem, ale czytałem, że jeśli 'int' lub' uint' jest niezainicjowany, jego wartość jest zawsze 0. – rhino

+0

nie ma problemu, cieszę się z pomocy. Re: twoja odpowiedź na 2), zgadza się, ale jeśli zmienisz swój i poza pętlami, twoja druga pętla będzie miała teraz wartość poprzedniej pętli. więc uważaj. Z mojego doświadczenia wynika, że ​​zawsze lepiej jest być wyraźnym. –

3

Deklaracja zmiennej poza pętlami, aby tego uniknąć. Tak długo, jak go resetujesz (i = 0), możesz nadal używać go we wszystkich pętlach.

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

Jak wspomniano here, AS3 ma zasięg globalny i lokalny i to wszystko.

Nie robi blokowy określania zakresu (lub, na poziomie albo). Dzięki podnoszeniu możesz nawet pisać do zmiennych przed ich zdefiniowaniem. To bit że zrobi moją głowę :-)

Wczesne wersje Visual C miałem ten błąd, co prowadzi do różnego rodzaju cudownych funkowych obejścia makro, ale to nie jest błąd w AS3, że działa zgodnie z przeznaczeniem. Możesz ograniczyć swój kod do deklaracji tylko w pierwszej for lub przenieść deklarację poza wszystkie instrukcje for.

Tak czy inaczej, jest to kwestia przyjęcia, że ​​język działa w jedną stronę, choć może się wydawać, że jest to zły sposób :-)