Вам нужно изменить свой код на следующее:
hash_weekdays = Hash.new
weekdays.each do |item|
hash_weekdays[item[0]] = item[1]
end
hash_weekdays
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}
Когда первый элемент weekdays
(["Monday",2]
) передается в блок, переменная блока присваивается его значение:
item = ["Monday",2]
Поскольку вы должны ссылаться на каждый элемент item
, это обычно используют два блока переменных, значения которых заданы с помощью параллельного назначения (ака множественное присваивание):
day, nbr = ["Monday",2]
#=> ["Monday", 2]
day #=> "Monday"
nbr #=> 2
Это позволяет писать
hash_weekdays = {} # the more common way of writing hash_weekdays = Hash.new
weekdays.each { |day, nbr| hash_weekdays[day] = nbr } # used {...} rather than do..end
hash_weekdays
, который, возможно, яснее.
Обратите внимание, что вы сначала инициализируете hash_weekdays
пустым хешем, затем в конце вам нужна строка hash_weekdays
, если вы хотите получить новое значение хэша (например, в качестве последней строки метода). Вы можете уменьшить это к одной линии (очень рубин, как), используя метод Enumerable#each_with_object:
weekdays.each_with_object({}) { |item, hash_weekdays| hash_weekdays[item[0]] = item[1] }
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}
Заметим, что это использует параллельное назначение.Первый элемент передается в блок, [["Monday", 2], {}]
, назначается следующим образом:
item, hash_weekdays = weekdays.each_with_object({}).next
#=> [["Monday", 2], {}]
item
#=> ["Monday", 2]
hash_weekdays
#=> {}
путь Рубин использовать параллельное назначение в несколько более сложным образом:
weekdays.each_with_object({}) { |(day, nbr), hash_weekdays|
hash_weekdays[day] = nbr }
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}
Как уже отмечалось, то наиболее простой ответ заключается в использовании метода Hash::[] или (введен в v2.0) Array#to_h:
Hash[weekdays]
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}
Hash[*weekdays.flatten] #=> Hash["Monday", 2, "Tuesday", 4, "Thursday", 5]
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}
weekdays.to_h
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}
спасибо за объяснение @guitarman, есть ли Aw ay, чтобы пересмотреть мой 'weekdays.each' цикл, чтобы преодолеть это? – Brandon
спасибо! отлично работает :) – Brandon