2011-06-17 7 views
1

私はActionScript(Haxe)でいくつかのものをプログラミングしてきました。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)でマークされた行を削除すると、それを残していればそれは動作しません。私はあなたがなぜそれが起こるのかをすべて知ることができると確信しています。再度、感謝します!

+0

あなたのユースケースの詳細を教えていただけますか?私はこれを全く理解していません...あなたは同じ機能の256のコピーを作成していますが、決して値を保存しません。 'i'は一度インスタンス化され、各反復で上書きされます。私はあなたが作成する(重複する関数の配列に加えて)唯一の変数です。おそらく関数の結果を格納することはできますか?しかし、配列内に同じ関数を何度も何度も格納しても意味がありません。 –

+0

あなたはそれをより良く説明できますか?あなたがAS3のソースコードにコンパイルしている場合を除いて、このコードはHaXeのボックスの外で動作します。それは事実ですか? – Waneck

答えて

2

を、それがコールバックを使用する必要ありませんですが、これは動作するはずです(haXeのは、各ループ内のローカルVARを作成します):

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

func[0](); 
func[127](); 
「私」あなたは「コールバック」を使用しなければならないの値を保持するには
2

あなたが表示するものは、期待された/望ましい動作です。予想通り

/* not pseudo code ;) */ 

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

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

true、この場合コールバックは不要ですが、@hotpotatoによると – back2dos

関連する問題