Рефакторинг для обеспечения явности
Хотя можно создать вложенный инициализатор, используя синтаксис блока Hash # new , он не очень удобочитаем и (как вы видели) может быть трудно отлаживать. Поэтому может быть более полезно построить вложенный ha sh в несколько этапов, которые вы можете проверять и отлаживать, как go.
Кроме того, вы заранее знаете, какими будут ваши ключи: дни недели и утренние / дневные смены. Для этого варианта использования вы могли бы создать их заранее, а не полагаться на значения по умолчанию.
Учтите следующее:
require 'date'
# initialize your hash with a literal
schedule = {}
# use constant from Date module to initialize your
# lowercase keys
Date::DAYNAMES.each do |day|
# create keys with empty arrays for each shift
schedule[day.downcase] = {
"morning" => [],
"afternoon" => [],
}
end
Мне это кажется более явным и понятным, но, по общему признанию, субъективно. Между тем, вызов pp schedule
покажет вам новую структуру данных:
{"sunday"=>{"morning"=>[], "afternoon"=>[]},
"monday"=>{"morning"=>[], "afternoon"=>[]},
"tuesday"=>{"morning"=>[], "afternoon"=>[]},
"wednesday"=>{"morning"=>[], "afternoon"=>[]},
"thursday"=>{"morning"=>[], "afternoon"=>[]},
"friday"=>{"morning"=>[], "afternoon"=>[]},
"saturday"=>{"morning"=>[], "afternoon"=>[]}}
Затем новой структуре данных могут быть присвоены значения вложенного массива, как вы в настоящее время ожидаете:
schedule["monday"]["morning"].append("Ben")
#=> ["Ben"]
Как дальнейшее уточнение, вы можете добавлять к своим вложенным массивам способом, который гарантирует, что вы не дублируете имена в пределах запланированной смены. Например:
schedule["monday"]["morning"].<<("Ben").uniq!
schedule["monday"]
#=> {"morning"=>["Ben"], "afternoon"=>[]}