2009-03-06 8 views
13

Je voudrais connaître l'ordre d'itération pour les types Array, Dictionary et Object dans AS3, pour les boucles for-each et for-in. Quels facteurs peuvent également modifier l'ordre d'itération de ces combinaisons de type de boucle?Pour chaque boucle AS3: La direction est-elle garantie?

Par exemple, je suppose que l'utilisation d'un pour chaque sur un type de tableau se déplace toujours du premier élément à la dernière. For-each ne peut pas être utilisé sur un dictionnaire alors comment l'ordre est-il déterminé en utilisant une boucle for-in?

+0

+1. Très bonne question, quelles sont vos observations? Je suis curieux! – dirkgently

+1

C'est une bonne base hein :) J'ai eu un bug dans le projet il y a un certain temps, que j'ai retracé à un tableau étant soit inversé, soit le pour-chacun le traversait vers l'avant. J'ai remplacé le for-each par un lopp for-index ++ et le bug a disparu. Je n'ai jamais vraiment vérifié à 100% quelle était la cause. –

Répondre

5

Voulez-vous dire le type for (x in y) pour chaque boucle? La spécification AS3 indique que les boucles "ont la même syntaxe et la même sémantique que celles définies dans l'édition ECMA-262 3 et E4X". L'ECMA-262, section 12.6.4 indique que «l'ordre d'énumération est défini par l'objet» - en d'autres termes, cela dépend si vous itérez une liste, un dictionnaire, un tableau, etc.

Je voudrais espoir que la documentation pour la plupart des collections indiquera explicitement l'ordre d'énumération (ou que l'ordre ne soit pas défini) mais je ne l'ai pas vérifié ...

EDIT: Malheureusement, l'état des spécifications que "la mécanique d'énumération des propriétés [...] dépend de l'implémentation". Je ne vois rien dans les documents Array pour spécifier l'ordre. C'est un peu insatisfaisant, pour être honnête :(

+0

Merci Jon, je viens de faire la question plus précise en fonction de votre réponse –

+1

J'ai complètement reformulé la question, je pense que c'est assez clair maintenant :) –

+1

Merci pour l'édition Jon, Il est certainement insatisfaisant que ce n'est pas spécifié dans la documentation. Je vais jeter un oeil à la documentation spécifique AS3 sur ce –

2

L'ordre d'évaluation a changé dans AS3.0 Plus tôt, dans AS 1.0 et 2.0, l'ordre d'évaluation était basé sur l'ordre dans lequel les objets ont été ajoutés. 3,0, tout en boucle maintient l'ordre de matrice Essayer l'extrait.

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

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

Essayer le dessus avec AS3.0 et AS1.0/2,0

+0

La question est de savoir si ce code produit la même sortie pour différents temps d'exécution Flash. – Pup

8

Comme indiqué dans Essential Actionscript 3.0 par Colin Moock, l'ordre de pour chaque boucle in n'est pas garantie sauf si l'énumération d'un objet XML ou XMLList;

Click here for Colin Moock's words from his book.

Il y a des solutions de contournement comme discuté here, mais honnêtement si vous avez besoin pour garantir l'ordre, puis il suffit d'utiliser une ancienne régulière pour la boucle et ont itérer (longueur, numChildren, etc.) nombre de fois.

+0

Y a-t-il une raison particulière pour que la commande ne soit pas garantie? Je peux comprendre parce qu'un tableau peut avoir une indexation non numérique. Ce qui m'amène à me demander ... sûrement un Vector. <> A un ordre garanti puisqu'il est stocké séquentiellement en mémoire? –

+0

Comme je l'ai indiqué ci-dessus, Colin Moock a couvert cela en détail, n'hésitez pas à suivre le lien ci-dessus qui est pris directement à partir de son livre. -Cheers –

+2

Pour être honnête, je suis assez mal à l'aise avec cette déclaration si aucune raison n'est donnée. Ce n'est pas que je le croie faux, mais qu'il n'y a pas de logique ou de raisonnement derrière (probablement dû à l'édition).Je m'intéresse à la mécanique interne des raisons pour lesquelles une boucle ne peut garantir l'ordre sur un tableau. –

Questions connexes