为什么这个Ruby 1.9代码导致空哈希?

时间:2010-05-06 00:32:54

标签: ruby

我正在尝试将3个数组压缩成哈希值。但哈希是空的。这是使用Ruby 1.9重现的示例代码:

>> foo0 = ["a","b"]
=> ["a", "b"]
>> foo1 = ["c","d"]
=> ["c", "d"]
>> foo2 = ["e", "f"]
=> ["e", "f"]
>> h = Hash[foo0.zip(foo1, foo2)]
=> {}

我想拉链这些,然后执行以下操作:

h.each_pair do |letter0, letter1, letter2|
   # process letter0, letter1
end

4 个答案:

答案 0 :(得分:1)

目前尚不清楚您对输出的期望是什么,但[]类的Hash operator旨在获取偶数个参数并返回每个偶数的新哈希带编号的参数是相应奇数值的关键。

例如,如果您引入foo3 = ["d"]并希望获得{"a"=>"b", "c"=>"d"}之类的哈希值,则可以执行以下操作:

>> Hash[*foo0.zip(foo1, foo2, foo3).flatten]
=> {"a"=>"b", "c"=>"d"}

答案 1 :(得分:0)

Hash[]不像你假设的那样有效。相反,试试这个:

>> Hash[*foo0, *foo1, *foo2]
=> {"a"=>"b", "c"=>"d", "e"=>"f"}

或者,我的首选方法:

>> Hash[*[foo0, foo1, foo2].flatten]
=> {"a"=>"b", "c"=>"d", "e"=>"f"}

基本上,Hash[]期待偶数个参数,如Hash[key1, val1, ...]。 splat运算符*正在将数组作为参数应用。

答案 2 :(得分:0)

看起来foo0.zip(foo1,foo2)生成:     [[“a”,“b”,“c”]]

对于Hash [],这不是可接受的输入。你需要传递一个平面阵列。

答案 3 :(得分:0)

你不需要哈希来完成你想要完成的任务,拉链为你做了

foo0.zip(foo1, foo2) do |f0, f1, f2|
  #process stuff here
end