Ruby: неправильный тип элемента Symbol в 0 (ожидаемый массив) - PullRequest
0 голосов
/ 29 апреля 2018

Мне интересно, почему попытка преобразовать этот массив в хеш вызывает ошибку:

[:a, [1,2,3]].to_h
=> TypeError: wrong element type Symbol at 0 (expected array)
Hash[ [:a, [1,2,3]] ]
=> ArgumentError: invalid number of elements (3 for 1..2)

Массив содержит два элемента. Поэтому его следует легко преобразовать в пару ключ / значение, что и является хешем.

У меня есть коллекция, которая выглядит так:

 [ [:a, [1,2,3]], [:b, [4,5,6]] ]

И я просто хочу сделать это массивом хешей:

[ [:a, [1,2,3]], [:b, [4,5,6]] ].collect {|collection| Hash[collection] }
=> ArgumentError: invalid number of elements (3 for 1..2)

Почему он не может преобразовать массив из двух элементов в пару ключ / значение?

Я мог бы сделать что-то вроде этого:

arr.collect {|item| { item[0] => item[1] } }
=> [{:a=>[1, 2, 3]}, {:b=>[4, 5, 6]}] 

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Это должно работать

.to_h принимает массив из нескольких пар значений ключа

[ [:a, [1,2,3]], [:b, [4,5,6]] ].to_h
=> {:a=>[1, 2, 3], :b=>[4, 5, 6]}

[ [:a, [1,2,3]] ].to_h
=> {:a=>[1, 2, 3]}

Hash [] принимает один ключ и значение

Hash[:a, [1,2,3]]
=> {:a=>[1, 2, 3]}

Пока они не будут

.to_h ожидает, что каждый элемент в массиве будет массивом из 2 элементов. Следовательно, если какой-либо элемент в массиве не является самим массивом, он выдает ошибку типа.

[:a, [1,2,3]].to_h
TypeError: wrong element type Symbol at 0 (expected array)

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

Hash[ [:a, [1,2,3]], [:b, [4,5,6]] ]
=> {[:a, [1, 2, 3]]=>[:b, [4, 5, 6]]}
0 голосов
/ 29 апреля 2018

Оберните это в [] еще раз

Вам нужен массив пар , так как один Hash может содержать многие из них, и эта особенность отражается в том, что принимают его конструкторы. Одна пара представляет собой массив с 2 элементами .

Hash[ [:a, [1,2,3]] ]

Это вызов Hash.[] с одной парой [:a, [1,2,3]].
Чтобы сделать его массивом пар, оберните его еще раз, получив [[:a, [1,2,3]]] или

Hash[[[:a, [1,2,3]]]
#   ↑↑↑
#   ||\_pair
#   |\_array of pairs
#   \_call to Hash.[]

Количество квадратных скобок здесь тошнотворное.

Если вашей конечной целью является массив хэшей, каждая из которых представляет собой одну пару, вы можете использовать деструктурирование в аргументах блока примерно так:

[ [:a, [1,2,3]], [:b, [4,5,6]] ].collect {|(a, b)| {a => b} }

Это буквально то же самое, что вы предлагаете в конце вашего вопроса, только без [].

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