ActionScript Haxe Оценивает ссылочную переменную внутри цикла в замыкании - PullRequest
1 голос
/ 18 июня 2011

Я программировал некоторые вещи в 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]();

Вышеприведенный код выводит (а):

256
256
256

Я хочу, чтобы это было (б):

0
127
256

Этого не происходит, потому что ActionScript / Haxe назначает ссылку на i функции, а поскольку i равно 256 в конце цикла, где функции оцениваются, поэтому я получаю (a).

Кто-нибудь знает способ избежать этого и получить ожидаемые результаты в (b)?

Спасибо всем вам, ребята, и ваши ответы.

Я думаю, что нашел ответ. Если вы удалите строку, помеченную (A), она сработает, если вы оставите ее, то не сработает. Я уверен, что вы все могли бы понять, почему это происходит. Еще раз спасибо!

Ответы [ 2 ]

2 голосов
/ 28 июня 2011

использовать обратный вызов не обязательно, это должно работать как положено (haxe создает локальную переменную в каждом цикле):

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

func[0]();
func[127]();
2 голосов
/ 18 июня 2011

То, что вы показываете, является ожидаемым / желаемым поведением. Чтобы сохранить значение «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]();
...