2010-05-06 2 views
1

Я пытаюсь закрепить 3 массива в хэш. Тем не менее, хеш становится пустым. Вот пример кода для воспроизведения с помощью Ruby 1.9:Почему этот код 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 

ответ

1

Это не ясно, что вы ожидаете, что выход будет, но []operator из Hash класса предназначено принять четное число аргументов и возвращает новый хеш, где каждый четный аргумент является ключевым для соответствующего нечетного значения ,

Например, если вы приведете foo3 = ["d"] и вы хотите, чтобы получить хэш как {"a"=>"b", "c"=>"d"} вы можете сделать следующее:

>> Hash[*foo0.zip(foo1, foo2, foo3).flatten] 
=> {"a"=>"b", "c"=>"d"} 
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 * применяет массивы в качестве аргументов.

0

Похоже foo0.zip (Foo1, Foo2) порождает: [[» a "," b "," c "]]

Это не приемлемый вход для Hash []. Вам нужно передать плоский массив.

0

вам не нужно Hash за то, что вы пытаетесь достичь, застежка-молния делает это для вас

foo0.zip(foo1, foo2) do |f0, f1, f2| 
    #process stuff here 
end 
Смежные вопросы