Перебор хэша в Ruby. Разница между этими двумя примерами?

#ruby #loops #hash

#ruby #циклы #хэш

Вопрос:

Я пытаюсь немного изучить Ruby. Может кто-нибудь, пожалуйста, объяснить мне разницу между этими двумя примерами?

Скажем, что у меня есть хэш:

 family = { "Homer" => "dad",
  "Marge" => "mom",
  "Lisa" => "sister",
  "Maggie" => "sister",
  "Abe" => "grandpa",
  "Santa's Little Helper" => "dog"
}
  

Если я повторяю так:

 family.each { |x| puts "#{x}" }
  

Я понимаю это:

 ["Homer", "dad"]
["Marge", "mom"]
["Lisa", "sister"]
["Maggie", "sister"]
["Abe", "grandpa"]
["Santa's Little Helper", "dog"]
  

Когда я повторяю так:

 family.each { |x, y| puts "#{x}: #{y}" }
  

Я понимаю это:

 Homer: dad
Marge: mom
Lisa: sister
Maggie: sister
Abe: grandpa
Santa's Little Helper: dog
  

Может кто-нибудь, пожалуйста, объяснить, чем отличаются два результата (что означают квадратные скобки, кавычки, запятые, двоеточия?), и когда можно использовать один против другой? Спасибо!

Ответ №1:

Когда вы повторяете хэш, он передает пару key , value в качестве параметра в формате массива из двух элементов: [key, value] . Именно по этой причине, которую вы видите ["Homer", "dad"] в вашем первом примере, x присваивается массив.

Второй пример тот же, но в этом случае вы присваиваете пару x и y . x возвращает первый элемент массива и y второй элемент, что в ruby называется множественным присваиванием.

 2.2.2 :001 > x = {a: 1}.first
 => [:a, 1] 
2.2.2 :002 > x
 => [:a, 1] 
2.2.2 :003 > x,y ={a: 1}.first
 => [:a, 1] 
2.2.2 :004 > x
 => :a 
2.2.2 :005 > y
 => 1 
  

Ответ №2:

В вашем первом примере вы перебираете каждый полный элемент хэша ( x ) и печатаете его как единственную пару ключ: значение, в результате чего получается формат в квадратных скобках.

Во втором примере вы снова повторяете каждый элемент хэша, но специально разбиваете этот элемент на ключ и значение ( x , y ), которые подаются в puts инструкцию, и печатаете их с вашим собственным форматированием.