J'ajoutais des articles à une clé de hachage. Je m'attendais à obtenir une structure comme celle-ci: J'ai utilisé un tableau pour initialiser le hachage. P> puis a commencé à l'utiliser: p> mais il s'avère: P> irb> hash
=> {}
4 Réponses :
qui devrait vous donner le hachage hachage ['a'] << 1 code> et hachage ['B'] << 2 code> n'est pas une syntaxe correcte pour la création d'une touche clé / valeur. Vous devez utiliser = code> pour cela: {'A': [1], 'B': [2 ]} code> p> p>
Essayez le suivant à la place:
hash = Hash.new{|h, k| h[k] = []}
hash['a'] << 1 # => [1]
hash['b'] << 2 # => [2]
+1 "Vous avez spécifié un tableau vide comme valeur par défaut, mais le même tableau est utilisé". Bingo!
Quoi?! C'est vraiment étrange pour moi. Lorsque vous utilisez une chaîne, une chaîne n'est pas réutilisée. La chaîne peut être une sorte de type de valeur, mais je pensais que "tout" était un objet dans Ruby. Pourquoi la différence entre chaînes et autres objets?
@ Cort3Z: Je ne sais pas ce que tu veux dire. Peut-être que cela peut aider à montrer qu'il n'y a pas de différence: a = b = 'foo'; A.Replace 'bar'; b # => 'bar' code>
Peut-être que je n'étais pas clair: ce que je voulais dire était que je pense qu'il est étrange que lorsque vous faites hash.new ([]) code> il utilise le même objet de tableau, mais lorsque vous faites hachage ("string") code> Il n'utilise pas la même chaîne.
@ Cort3Z: Il utilisera la même chaîne. h = hash.new ("ne fais pas ça"); h [0] .uppase!; h [1] # => "Ne faites pas cela" code>
@ Marc-andrélafortune maintenant je vois ce qui se passe. Je faisais h = hash.new ("w"); h ["test"] = "données"; p h ["a"] # => "w" code>. Je suppose que cela réaffecte l'objet pour h ["test"] code> uniquement et ne modifie pas réellement l'objet.
the constructeur Vous avez utilisé des stocks expliquer plus en détail: p> quand vous faites < Code> hachage ['A'] << 1 code> C'est ce qui se passe: p> Si ce que vous voulez, c'est de stocker la paire de valeurs de clé, utilisez la troisième forme du constructeur avec un bloc: p> [] code> comme le Valeur par défaut Pour revenir lors de l'accès des touches inconnues. Depuis tableau # <<< / code> modifie son récepteur en place em> Ce tableau initialement vide pousse.
hachage code> est de voir s'il y a une touche nommée 'a' code> li>
hachage.new ([]) code> il a une telle valeur, [] code> et cela revient. LI>
[] << 1 code> est évalué et cela signifie que HASH stocke désormais [1] code> comme valeur à revenir lorsqu'une touche précédemment non engagée est demandée. li>
ol>
Ceci est exactement em> le comportement que vous vous attendez à voir. P>
Vous n'ajoutez jamais quoi que ce soit au Alors, vous recherchez la touche Ensuite, vous recherchez la clé Vous vous retrouvez avec un La sortie que vous voyez est que la IRB imprime toujours le résultat de la dernière expression qui a été évaluée. La dernière expression de votre exemple est appelée hachage code>, donc le hachage code> est complètement vide. Lorsque vous recherchez une clé, cette touche n'existera jamais, il renvoie donc la valeur par défaut, que vous avez spécifiée pour être un tableau code>. P>.
'A' code>, qui n'existe pas et renvoie donc le tableau code> que vous avez spécifié comme valeur par défaut. Ensuite, vous appelez <<< / code> sur ce tableau code>, qui ajoute une valeur ( 1 code>). P>
'B' code>, qui n'existe pas non plus et renvoie donc le tableau code> que vous avez spécifié comme valeur par défaut, qui contient maintenant L'élément 1 code> vous a ajouté plus tôt. Ensuite, vous appelez <<< / code> sur ce tableau code>, ajoute la valeur 2 code> à celui-ci. P>
hachage code> toujours vide, car vous ne l'ayez jamais rien ajouté. La valeur par défaut du hachage code> est maintenant un tableau contenant les valeurs 1 code> et 2 code>. P>
<<< / code> sur le tableau code>. <<< / code> renvoie son récepteur, qui est ensuite la valeur de retour de l'ensemble de l'expression et donc quelle IRB imprime. P>
C'est exactement ce que vous demandez, et pas du tout ce que vous voulez dire!
Êtes-vous pas sûr de la sortie que vous voyez? Ou ce que le hachage contient réellement? On ne sait pas ce que vous recherchez ici.