Ответ 1
Оператор splat (т.е. *
) превращает то, что в противном случае было бы массивом в список для назначения в хеше. Вы должны дать оператору []
фактический список, чтобы он превратился в пары ключ/значение хэша. (См. Ниже ссылку на краткое описание оператора splat, который действительно может это сделать (разматывать массив в список) или наоборот (собрать список в массив).
Как вы делали это выше, вы даете Hash[]
нечетное количество элементов, а именно один массив. (Подумайте о том, что производит [[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten
. Он дает [:first_name, 'Shane', :last_name, 'Havie']
.) Как указано в ваших документах, оператор []
должен иметь четное число элементов. Обратите внимание, что работает следующее (хотя и бесполезное):
>> Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten, 1]
=> {[:first_name, "Shane", :last_name, "Harvie"]=>1}
(Мне непонятно, почему вы не получаете ошибку "нечетное количество аргументов для Hash" при использовании кода, который у вас выше, как вы делаете, если вы попробуете Hash[1]
.)
Более простой пример может сделать его более ясным. Сначала, передавая один элемент, массив. Открытие массива с помощью *
, чтобы передать Hash[]
список элементов:
>> Hash[['foo', 'bar', 'bizz', 'buzz']]
=> {}
>> Hash[*['foo', 'bar', 'bizz', 'buzz']]
=> {"foo"=>"bar", "bizz"=>"buzz"}
См. это сообщение в блоге для более полного объяснения. Вы также можете найти эту короткую запись о операторе splat.