Создание хэша из массива - как это работает? - PullRequest
5 голосов
/ 22 сентября 2009
fruit = ["apple","red","banana","yellow"]
=> ["apple", "red", "banana", "yellow"]

Hash[*fruit]    
=> {"apple"=>"red", "banana"=>"yellow"}

Почему восклицательный знак приводит к тому, что массив так аккуратно разбирается в хэше?

Или, точнее, как хэш «знает», что «яблоко» - это ключ, а «красный» - его соответствующее значение?

Это просто потому, что они находятся в последовательных позициях в массиве фруктов?

Имеет ли значение, что сплат используется здесь? Может ли Hash не определять себя из массива так прямо, иначе?

Ответы [ 2 ]

10 голосов
/ 22 сентября 2009

В документации указано:

Hash["a", 100, "b", 200]       #=> {"a"=>100, "b"=>200}
Hash["a" => 100, "b" => 200]   #=> {"a"=>100, "b"=>200}
{ "a" => 100, "b" => 200 }     #=> {"a"=>100, "b"=>200}

Вы не можете передать массив методу Hash[] в соответствии с документацией, поэтому сплат - это просто способ взорвать массив fruit и передать его элементы как обычные аргументы Hash[] метод. Действительно, это очень распространенное использование оператора splat.

Круто то, что если вы попытаетесь передать нечетное количество аргументов в Hash, вы получите исключение ArgumentError:

fruit = ["apple","red","banana","yellow","orange"]
#=> ["apple", "red", "banana", "yellow", "orange"]
Hash[*fruit] #=> ArgumentError: odd number of arguments for Hash
2 голосов
/ 22 сентября 2009

Посмотрите на общедоступный метод класса [] в классе Hash. (Скажем, здесь.) В нем четко указано, что будет создан новый Hash (экземпляр) и заполнен данными объектами. Естественно, они встречаются парами. Оператор splat существенно расширяет массив при использовании в качестве параметра.

...