Петля For-Each AS3: направление гарантировано? - PullRequest
13 голосов
/ 06 марта 2009

Я хотел бы знать порядок итераций для типов Array, Dictionary и Object в AS3, как для циклов for-each, так и for-in. Также, какие факторы могут изменить порядок итераций этих комбинаций типа цикла?

Например, я предполагаю, что использование for-each для типа Array всегда перемещает от первого элемента к последнему. For-each нельзя использовать в словаре, так как порядок определяется с помощью цикла for-in?

Ответы [ 3 ]

8 голосов
/ 07 марта 2009

Как указано в Essential Actionscript 3.0 Колином Моком, порядок a для каждого цикла in не гарантируется, если не перечислить объект XML или XMLList;

Нажмите здесь, чтобы прочитать слова Колина Мука из его книги.

Существуют обходные пути, как обсуждено здесь , но, если честно, если вам нужно гарантировать порядок, просто используйте обычный старый цикл for и выполняйте его итерацию (length, numChildren и т. Д.) Несколько раз.

5 голосов
/ 06 марта 2009

Вы имеете в виду тип for (x in y) для каждого цикла? Спецификация AS3 гласит, что циклы for "имеют тот же синтаксис и семантику, что определены в ECMA-262, выпуск 3 и E4X".

ECMA-262, раздел 12.6.4 заявляет, что «порядок перечисления определяется объектом» - другими словами, это будет зависеть от того, выполняете ли вы итерацию по списку, словарю, массиву и т. Д. 1004 *

Я бы надеялся , что в документации для большинства коллекций будет явно указан порядок перечисления (или что порядок не определен), но я не проверял ...

EDIT: К сожалению, спецификации утверждают, что "механизм перечисления свойств [...] зависит от реализации". Я не вижу ничего в документах Array, чтобы указать порядок. Честно говоря, это неудовлетворительно: (

2 голосов
/ 06 марта 2009

Порядок оценки изменился в AS3.0 Ранее, в AS 1.0 и 2.0, порядок оценки основывался на порядке добавления объектов. Теперь в 3.0 все циклы поддерживают порядок массивов. Попробуйте фрагмент:

var a:Array = new Array();
a[ 1 ] = 'first';
a[ 0 ] = 'second';

for (var key:String in a) 
    trace( key + ': ' + a[ key ] );

Попробуйте выше с AS3.0 и AS1.0 / 2.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...