2014-06-22 36 views
0

如果我有像這樣的接受別名和根名稱爲基本顏色列表的哈希:使用lambda表達式,而不依賴於條件語句或普查員

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 

應該按預期工作。

我想知道是否有更優雅的方式來做到這一點,特別是不涉及條件塊甚至統計員的方式。三元運算符是好的或更好的,因爲它們是緊湊的,但仍然不是優選的,因爲它們是條件。

+0

所有我能想到的是哈希選擇器模式:https://www.codemy.net/posts/hash-選擇器模式 這與做coloraliases ['crimson']非常相似... ... –

+1

每個鍵單獨映射到相應的基本顏色有什麼問題?我現在看到@sawa在我救了這個之前建議了幾秒鐘。 – pjs

回答

4

你的散列設計是錯誤的。你沒有使用散列應該被使用的方式。它應該是:

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" 
+0

令人沮喪的簡單。謝謝 –

+0

「但這不是我的大腦工作方式!」大聲笑 –