forEach. Вскрытие
Запись от BuKT размещена 14.04.2011 в 04:37
Это интересно. В ActionScript 3.0 действует хитрое хеширование значений. Даже при условии ссылочности переменных, не всегда изменение значения переменной приведёт к мгновенному изменению значений переменных, ссылающихся на исходную.
Например - forEach. Следующий код предназначен для наращивания значений массива до единицы для array[array.length - 1] (при исходной сумме всех значений в единицу). Вероятности, короче, рассчитывает:
probsArray.forEach(function(e:Number,i:int,arr:Array){ if (i > 0) { e += arr[i-1]; } trace (i + ': ' + e); });
Результирующий массив будет аналогичным
Понятно, что происходит? При каждом запросе значений массива внутри коллбека функции forEach — `arr` возвращает кешированное значение, т.к. фактическое присвоение каждому элементу `e` наращиваемого значения происходит по закрытию всех коллбеков. И запрашивая arr[i-1] мы запрашиваем не `e` из прошлой итерации, а неизменённое исходное значение этого элемента массива.
Поэтому, если мы хотим в этой же (или в любой последующей) итерации получить изменённое значение: изменять значения элементов массива следует по прямой ссылке на них (вместо изменения внутренней переменной `e` метода forEach). Примерно так:
Всего комментариев 5
Комментарии
14.04.2011 12:19 | |
Меня больше всего удивляет то, что и String тоже является примитивным типом. А с числами оно, по-моему, везде так: передача идет не по ссылке, а по значению.
|
14.04.2011 12:20 | |
Алхимик придумывает теорию про животворящий эфир.
|
14.04.2011 12:44 | |
Сорри, писалось в пять утра после долгого мозгообмывательства. Если получится - исправлю на что-то более удобочитаемое
|
18.12.2011 15:45 | |
Цитата:
Меня больше всего удивляет то, что и String тоже является примитивным типом. А с числами оно, по-моему, везде так: передача идет не по ссылке, а по значению.
Просто его нельзя менять. Можно только создать новую строку. В Java/С# тоже поменять строку нельзя. Числа при кодинге тоже можно считать объектами, которые не меняются, например: Только на уровне виртуальной машины их нет смысла передавать по ссылке - они весят столько же сколько сама ссылка. По-моему, все объясняется без всяких "теорий кеширования". Меняем ведь локальную переменную e, а не переменную контекста, захваченную замыканием или другую, глобальную по отношению к анонимной функции. |
|
Обновил(-а) expl 18.12.2011 в 15:58
|
Последние записи от BuKT
- О вопросе энтропии в реализации интерфейсов (02.07.2012)
- Работа с математикой Number при твининге DisplayObject (06.03.2012)
- Bloom и HDR пост-эффекты. (09.01.2012)
- Продажа игр (18.10.2011)
- forEach. Вскрытие (14.04.2011)