1

私はActionScript(Haxe)でいくつかのものをプログラミングしていて、この非常に特殊な問題に到達しました。

コードは次のとおりです(疑似:S):

var func:Array = new Array(256);
(A) var i:Int = 0;
for(;i<256;i++) {  // OR // for(i in 0...256) {
  func[i] = function() { trace(i); }
}

func[0]();
func[127]();
func[256]();

上記のコードは(a)を出力します:

256
256
256

私はそれを(b)にしたい:

0
127
256

これは起こりません。ActionScript/Haxeがiの参照を関数に割り当てており、関数が評価されるループの最後でiが256に等しいため、(a)を取得します。

誰かがそれを避けて(b)で期待される結果を得る方法を知っていますか?

皆さんとあなたの反応に感謝します。

私は答えを見つけたと思います。(A)でマークされた行を削除すると機能しますが、そのままにしておくと機能しません。なぜそうなるのか、皆さんも理解できると思います。再度、感謝します!

4

2 に答える 2

2

表示するのは、期待される/望ましい動作です。「i」の値を保持するには、「コールバック」を使用する必要があります。

/* not pseudo code ;) */

var func = [];
for(i in 0...256)
  func[i] = callback(function(v) trace(v), i);

func[0]();
func[127]();
func[256]();
于 2011-06-17T22:32:43.483 に答える
2

コールバックを使用する必要はありません。これは期待どおりに機能するはずです(haxeは各ループでローカル変数を作成します)。

var func = [];
for(i in 0...256)
  func[i] = function() trace(i);

func[0]();
func[127]();
于 2011-06-28T17:13:03.820 に答える