Question

    

Cette question a déjà une réponse ici:

         

Ok, je voulais donc créer un hachage qui a un hachage vide comme valeur par défaut. Un peu bizarre, je sais, mais disons que je pensais que cela pourrait être utile.

Alors voici ce que j'ai fait:

>> a = Hash.new({})
=> {}
>> a[:a][:b] = 5
=> 5
>> a
=> {}
>> a[:a]
=> {:b=>5}
>> a.keys
=> []
>> a.size
=> 0
>> a[:a].size
=> 1

En d'autres termes, je ne vois pas le membre de hachage lorsque j'inspecte le hachage, mais je peux y accéder par sa clé.

Ce comportement est-il attendu? Que se passe-t-il ici?

BTW, il s’agit de Ruby 1.9.1, je n’ai pas essayé les versions précédentes.

Éditer: exemple simplifié puisqu'il ne doit pas s'agir d'un hachage de hachages ...

Était-ce utile?

La solution

C’est le comportement attendu (dans toutes les versions de ruby). Et si vous essayez un peu plus loin, vous verrez que vous accédez toujours au même hachage, quelle que soit la clé utilisée:

>> a[:a][:b] = 1
=> 1
>> a[:c][:d] = 2
=> 2
>> a[:d]
=> {:b=>1, :d=>2}

La façon dont Hash.new fonctionne avec un argument par défaut est la suivante: Si vous faites hash [clé] , il vérifie si cette clé existe dans le hachage. Si c'est le cas, il renvoie la valeur pour cette clé. Sinon, il retourne la valeur par défaut. Il n'ajoute pas la clé au hachage et renvoie le même objet par défaut (pas une copie) à chaque fois.

Pour obtenir ce que vous voulez, vous voulez plutôt spécifier un bloc par défaut. De cette façon, le bloc sera exécuté chaque fois que vous accéderez à une clé qui n'est pas dans le hachage. À l’intérieur du bloc, vous pouvez créer un nouveau hachage et définir la clé sur "point". à ce hash. Comme si:

Hash.new { |h,k|  h[k] = {} }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top