Domanda

Vorrei conoscere l'ordine di iterazione per i tipi di array, dizionario e oggetto in AS3, sia per i cicli for-each che for-in. Inoltre, quali fattori possono cambiare l'ordine di iterazione di queste combinazioni di tipi di loop?

Ad esempio presumo che l'uso di un for-each su un tipo di array passi sempre dal primo elemento all'ultimo. For-each non può essere utilizzato su un dizionario, quindi come viene determinato l'ordine utilizzando un ciclo for-in?

È stato utile?

Soluzione

Intendi il per (x in y) tipo di per ogni ciclo? La specifica AS3 afferma che per i loop "hanno la stessa sintassi e semantica definite nell'ECMA-262 edizione 3 e E4X".

ECMA-262, sezione 12.6.4 afferma che "l'ordine di enumerazione è definito dall'oggetto" - in altre parole, dipenderà dal fatto che tu stia iterando attraverso un elenco, un dizionario, un array ecc.

Vorrei sperare che la documentazione per la maggior parte delle raccolte indichi esplicitamente l'ordine di enumerazione (o che l'ordine non sia definito) ma non ho controllato ...

EDIT: purtroppo le specifiche affermano che "i meccanismi di enumerazione delle proprietà [...] dipendono dall'implementazione." Non riesco a vedere nulla nei documenti dell'array per specificare l'ordinamento. È un po 'insoddisfacente, a dire il vero :(

Altri suggerimenti

Come indicato in Essential Actionscript 3.0 di Colin Moock, l'ordine di a per ogni ciclo in-loop non è garantito se non si enumera un oggetto XML o XMLList;

Fai clic qui per le parole di Colin Moock dal suo libro.

Ci sono soluzioni alternative come discusso qui , ma onestamente se devi garantire l'ordine, usa semplicemente un vecchio ciclo regolare e fallo iterare (lunghezza, numChildren, ecc.) volte.

L'ordine di valutazione è cambiato in AS3.0 In precedenza, in AS 1.0 e 2.0, l'ordine di valutazione si basava sull'ordine in cui venivano aggiunti gli oggetti. Ora, in 3.0, tutti i loop mantengono l'ordine dell'array. Prova lo snippet:

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

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

Prova quanto sopra con AS3.0 e AS1.0 / 2.0

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top