Почему этот код Ruby 1.9 приводит к пустому хешу? - PullRequest
1 голос
/ 06 мая 2010

Я пытаюсь сжать 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 ]

1 голос
/ 06 мая 2010

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

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

>> Hash[*foo0.zip(foo1, foo2, foo3).flatten]
=> {"a"=>"b", "c"=>"d"}
0 голосов
/ 06 мая 2010

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

foo0.zip(foo1, foo2) do |f0, f1, f2|
  #process stuff here
end
0 голосов
/ 06 мая 2010

Похоже, что foo0.zip (foo1, foo2) генерирует: [["a", "b", "c"]]

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

0 голосов
/ 06 мая 2010

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 * применяет массивы в качестве аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...