2011-10-20 3 views
1

Je suis confus quant à ce comportement. Ai-je vraiment besoin de diviser ma matrice pour que cela fonctionne?Conversion de tableau en hachage

pry(main)> ary = ["foo", "bar"] 
=> ["foo", "bar"] 

pry(main)> Hash[ary] 
=> {"f"=>"o", "b"=>"a"} 

pry(main)> Hash["foo", "bar"] 
=> {"foo"=>"bar"} 

pry(main)> Hash[["foo", "bar"]] 
=> {"f"=>"o", "b"=>"a"} 

pry(main)> Hash[ary.split(",")] 
=> {"foo"=>"bar"} 
+0

Dans ruby ​​1.9, les exemples 1 et 3 donnent un tableau vide. – steenslag

+0

Tous ces exemples sont dans Ruby 1.9.3dev –

Répondre

3

Essais 1 et 3 ci-dessus sont équivalents, le passage d'un seul réseau bidimensionnel au constructeur, ce qui est incorrect.

Pour que cela fonctionne comme prévu, vous aurez besoin de passer les paramètres comme arguments séparés, ou en 2 dimensions de paires>

# Split the array into args (equivalent to example #2 above) 
# equivalent to Hash[key1, val1, key2, val2] 
Hash[*ary] 

# or wrap the array in another array (an array of nested pairs) 
# equivalent to Hash[[[key1,val1],[key2,val2]]] 
Hash[[ary]] 

Le comportement incorrect que vous voyez est probablement parce que le constructeur attend un tableau de tableaux de longueur-2, alors que vous avez passé un tableau de chaînes. Il interprète arg[0] comme la clé pour chaque paire, et arg[1] comme la valeur, dans ce cas f et o, b et a.

Questions connexes