34 votes

L'ordre de hachage est préservé entre les itérations s'il n'est pas modifié ?

Si j'itère une fois sur un hachage, puis le refais sans en modifier le contenu, est-il garanti que les clés apparaissent dans le même ordre ?

Un test rapide le suggère :

> h = {'a' => 1, 'b' => 2, 'c' => 3}
> 100_000.times.map { h.to_s == h.to_s }.all?
=> true

Une autre question : si ce qui précède est autorisé, puis-je le parcourir en changeant uniquement les valeurs, sans ajouter de nouvelles clés, et faire en sorte que l'ordre des clés reste inchangé ?

similaire à cette question sur Python : Les dicts préservent-ils l'ordre d'itération s'ils ne sont pas modifiés ?

Contrairement à la proposition de duplicata, je ne suis pas intéressé par le fait que les éléments aient un ordre entièrement spécifié, mais seulement par la restriction selon laquelle deux itérations consécutives sans modification fournissent la même séquence.

64voto

Justin L. Points 6129

Avant la version 1.9, le comportement des hachages énumérés n'était pas dans les spécifications de ruby et dépendait donc de l'implémentation - en fait, le comportement/le modèle d'énumération des hachages n'était pas défini par le langage et les implémentations pouvaient vraiment faire ce qu'elles voulaient (aléatoire ? trié ? ordre d'insertion ? méthode différente à chaque fois ? tout est possible !)

1.9+, l'énumération de hachage est spécifiée par le langage pour être dans l'ordre d'insertion, donc si vous savez que votre plateforme est 1.9+, vous pouvez vous y fier.

RubySpec

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X