Проходя по ссылке в AS3 - PullRequest
       2

Проходя по ссылке в AS3

1 голос
/ 12 января 2011

Как передать значения по ссылке внутри конструкции for each в AS3? По сути, я хочу что-то эквивалентное следующему коду в PHP:

foreach ($array as &$v) {
  $v = $v + 1;
}

Это позволило бы мне изменить все элементы коллекции $array через один цикл.

Ответы [ 3 ]

5 голосов
/ 12 января 2011

Указатели не существуют в AS3, поэтому вам нужно использовать метод Array.forEach, который выполняет функцию для каждого элемента в массиве:

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html?filter_coldfusion=9&filter_flex=3&filter_flashplayer=10&filter_air=1.5#forEach%28%29

Немного не по теме, но больше информации о значениях и ссылках в AS3 (для функций)

В ActionScript 3.0 все аргументы передаются по ссылке, поскольку все значения хранятся в виде объектов. Однако объекты, принадлежащие к примитивным типам данных, включая логические, Number, int, uint и String, имеют специальные операторы, которые заставляют их вести себя так, как если бы они были переданы по значению.

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f56.html

1 голос
/ 13 января 2011

Вы не можете сделать это так, как вы это делаете в PHP.Для каждого цикла будет получена ссылочная переменная v, которую вы можете использовать для получения значения, но установка v = v + 1 не изменит исходный массив, но сотрет ссылку и установит новое значение только для v. Но вы все равно можете изменитьвсе значения массива в одном цикле:

Для простого массива:

var array1 : Array = [ "one", "two", "three" ];
for (var i : int = 0; i < array1.length; i++)
{
    array1[i] = "number " + array1[i];
}

Для ассоциативного массива (на самом деле это объект во Flash), используйте for ... in:

var array2 : Object = { one:"one", two:"two", three:"three" };
for (var s:String in array2) // s is the string value of the array key
{
    array2[s] = "number " + array2[s];
}

Я думаю, что второе - это то, что вы ищете.

0 голосов
/ 12 января 2011

РЕДАКТИРОВАТЬ : Weltraumpirat был прав.Мой оригинальный пример не изменял содержимое исходного массива, что, вероятно, было тем, что хотел оригинальный постер.Вот некоторые обновленные примеры:

Обновленный пример с использованием for each:

for each (var s:String in arr)
{
  arr[arr.indexOf(s)] = "<Your value here>";
}

Обновленный пример с использованием стандартного цикла for:

for (var counter:int = 0; counter < arr.length; counter++)
{
  arr[counter] = "<your value here>";
}

Исходный пример [Неверно]:

for each (var s:String in array)
{
  s = <your value here>;
}
...