2010-12-18 16 views
12

私はforループの変数の変わった動作に気付きました。それは本当に問題ではありませんが、それは私に多くの障害です。
実は私はこのように二つのループを作成しました:私が受け取った何forループの可変スコープの混乱

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

は、コンパイルの警告だった:この警告
Warning: Duplicate variable definition.

は本当に私を驚かせました。他の言語で私に起こったようなことはありません。
変数が階層の上位にあり、ループのブロックから利用可能になると思われます。私はまた、中括弧でループブロックを受け入れようとしましたが、何も変更されませんでした。
どうしてですか?それは普通ですか?それを避けることは可能ですか?今のところ私は両方の変数に異なる名前を付けましたが、それは私が考える本当の解決策ではありません。 forループのほとんどでiという名前の変数を使用したいと思います。

答えて

14

:-)悪い方法だと考えていてもはい、ループの増分変数は、ループの親のスコープ内にありますループ自体の内部ではありません。これは意図的な例です。

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

    return i; 
} 

これにより、ループが終了するとiの値にアクセスできます。これは非常に便利なケースがたくさんあります。

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

は、あなたがあなたの警告を取り除く:あなたは同じスコープ内の複数のループを持っている場合に何をすべき

は、ループの外にI VARです。もう一つ考慮すべき点は、ループインクリメント変数の名前をより分かりやすいものにすることです。

更新:考慮するために、2つの他の事:

1)あなたはFlexがUINTを期待した色と場所のようなものを除きするuintを使用しないでください。それらはintの使用よりも遅いです。1更新出典]:それはこのようになりますが、もはやフラッシュプレーヤーの新しいバージョンの場合のないことがあります。source

2)あなたは、ループ宣言の内部でループ増分変数をVAR、あなたを確認します適切な初期化値(通常は0)に設定します。もしあなたがいなければ、バグを追跡するのをいくらか難しくすることができます。

+0

意味のある回答をありがとうございます。 :) BTW:1)私は 'uint'が遅いことを知らなかった。ありがとう、それは将来私を助けるかもしれない。 2)私は知っていますが、 'int'または' uint'が初期化されていない場合、その値は常に0です。 – rhino

+0

問題なし、喜んで助けてください。 Re:2)へのあなたの応答、そうですが、もしあなたが私のループの外側にいたら、2番目のループは前のループの値を持つようになります。ので注意してください。私の経験では、常に明示的にすることをお勧めします。 –

3

これを避けるには、変数iをループ外に宣言します。あなたがそれをリセットする限り(i = 0)、あなたはそれをすべてのループで使用することができます。

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

としてはhere述べたように、AS3は、グローバルとローカルスコープを持っており、それはそれについてです。

ブロックレベルのスコープ(またはレベルのいずれか)は行いません。ホイストを使用すると、定義する前に変数に書き込むことさえできます。 それは:-)で私の頭を行うだろうビットのビジュアルCの

初期のバージョンは素晴らしいファンキーなマクロの回避策のすべての種類につながる、このバグを持っていたが、これは設計されたとして、それが働いて、AS3ではバグではありません。コードを最初のforの宣言のみに制限するか、forステートメント以外の宣言を移動してください。

いずれかの方法で、それは言語は一つの方法を動作することを受け入れることの問題だ、あなたはそれが

関連する問題