34 votes

Des hachages d'idiots en Ruby?

La création de tables de hachage de hachages dans Ruby permet la pratique de deux (ou plus) dimensions des recherches. Cependant, lors de l'insertion, il faut toujours vérifier si le premier indice existe déjà dans la table de hachage. Par exemple:

h = Hash.new
h['x'] = Hash.new if not h.key?('x')
h['x']['y'] = value_to_insert

Il serait préférable d'effectuer les opérations suivantes lorsque la nouvelle valeur de Hachage est créé automatiquement:

h = Hash.new
h['x']['y'] = value_to_insert

De même, lorsque l'on cherche une valeur dans les cas où le premier indice n'existe pas déjà, il serait préférable que le nil est retourné plutôt que de recevoir une méthode non définie pour '[]' erreur.

looked_up_value = h['w']['z']

On pourrait créer un Hachage classe wrapper qui a ce problème, mais est-il un Rubis idiome pour accomplir cette tâche?

54voto

Konrad Rudolph Points 231505

Vous pouvez passer l' Hash.new fonction d'un bloc est exécuté pour donner une valeur par défaut dans le cas où la requête de la valeur n'existe pas encore:

h = Hash.new { |h, k| h[k] = Hash.new }

Bien sûr, cela peut être fait de manière récursive.

/EDIT: Wow, il y a un article de répondre à cette question.

Par souci d'exhaustivité, voici la solution à partir de l'article de profondeur arbitraire hachages:

hash = Hash.new(&(p=lambda{|h,k| h[k] = Hash.new(&p)}))

Les crédits vont à Kent à partir des Données de Bruit.

4voto

tadman Points 70178

L'autovivification, comme on l'appelle, est à la fois une bénédiction et une malédiction. Le problème peut être que si vous "regardez" une valeur avant qu'elle ne soit définie, vous êtes bloqué avec ce hachage vide dans la fente et vous devrez l'élaguer plus tard.

Si un peu d'anarchie ne vous dérange pas, vous pouvez toujours insérer des déclarations de style égales ou égales qui vous permettront de construire la structure attendue lorsque vous l'interrogerez:

 ((h ||= { })['w'] ||= { })['z']
 

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