Хэш с использованием лямбд, не полагаясь на условные выражения или перечислители

#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. Разочаровывающе просто. Спасибо