#ruby #hash #lambda
#ruby #хэш #лямбда
Вопрос:
Если бы у меня был такой список принятых псевдонимов и корневых имен для базовых цветов:
coloraliases = {
["red", "crimson", "auburn", "rose", "maroon", "burgundy"] => "red",
["blue", "teal", "aqua", "azure", "cobalt"] => "blue",
["green", "emerald", "absinthe", "avocado", "lime"] => "green",
["yellow", "banana", "lemon", "gold", "citrine"] => "yellow"
}
Я не мог просто сделать это:
coloraliases["crimson"]
#=> "red"
Я пытаюсь добиться такого поведения следующим образом:
basecolor = lambda do |str|
x = nil
coloraliases.each do |keys, value|
if keys.include?(str)
x = value
break
end
end# of coloraliases hash
x
end
который должен работать так, как ожидалось.
Мне интересно, есть ли какие-либо более элегантные способы сделать это, в частности, способы, не связанные с условными блоками или даже перечислителями. Троичные операторы в порядке или лучше, потому что они компактные, но все же не предпочтительнее, потому что они условные.
Комментарии:
1. Все, о чем я могу думать, это шаблон выбора хэша: codemy.net/posts/hash-selector-pattern Что в значительной степени похоже на выполнение coloraliases[‘малиновый’]…
2. Что плохого в том, что каждый из ключей по отдельности сопоставляется с соответствующим базовым цветом? Что я теперь вижу, @sawa предложил за несколько секунд до того, как я сохранил это.
Ответ №1:
Ваш дизайн хэша неверен. Вы не используете его так, как предполагается использовать хэш. Это должно быть:
coloraliases = {
"red" => "red",
"crimson" => "red",
"auburn" => "red",
"rose" => "red",
"maroon" => "red",
"burgundy" => "red",
"blue" => "blue",
"teal" => "blue",
"aqua" => "blue",
"azure" => "blue",
"cobalt" => "blue",
...
}
И тогда вы просто получите:
coloraliases["crimson"] # => "red"
Комментарии:
1. Разочаровывающе просто. Спасибо