Для удобства сопровождения я предлагаю вести данные в следующем хеше:
DATA = {
%w| boundary\ box | => 'Slide',
%w| circle rectangle | => 'GroupBox',
%w| text | => 'Text',
%w| picture pie bar trend star | => 'Content'
}
#=> {["boundary box"]=>"Slide", ["circle", "rectangle"]=>"GroupBox",
# ["text"]=>"Text", ["picture", "pie", "bar", "trend", "star"]=>"Content"}
Обратите внимание, что я сделал значения литералами (строками), чтобы продемонстрировать, как будет обрабатываться этот хеш.В реальном приложении значения не обязательно должны быть литералами.
Затем предоставьте метод для создания желаемого хеша h
из DATA
и указанного значения по умолчанию (последнее возвращается h[k]
, когдаh
не имеет ключа k
).
def data_to_hash(data, default)
data.each_with_object({}) { |(k,v),h| k.each { |obj| h[obj] = v } }.
tap { |h| h.default = default }
end
Это может использоваться следующим образом.
h = data_to_hash(DATA, 'Cat')
#=> {"boundary box"=>"Slide", "circle"=>"GroupBox",
# "rectangle"=>"GroupBox", "text"=>"Text", "picture"=>"Content",
# "pie"=>"Content", "bar"=>"Content", "trend"=>"Content",
# "star"=>"Content"}
h["boundary box"]
#=> "Slide"
h["pie"]
#=> "Content"
h["cake"]
#=> "Cat"
Чтобы впоследствии изменить значение по умолчанию, вы можете либо позвонить data_to_hash
снова с исправленным значением по умолчанию, либо просто выполните
h.default = "Dog"
, либо заключите последний в метод.
def change_default(h, new_default)
h.default = new_default
end
change_default(h, "Dog")
#=> "Dog"
h["pie"]
#=> "Content"
h["cake"]
#=> "Dog"