2012-06-27 63 views
3

我有散列映射使用正則表達式如紅寶石哈希關鍵字

H = { 
    "alc" => "AL", 
    "alco" => "AL", 
    "alcoh" => "AL", 
    "alcohol" => "AL", 
    "alcoholic" => "AL", 
} 

現在我想使用正則表達式來表示所有的鍵,如 H = { /^ ALC/=>「AL」 }

稍後我想用H [「alc」]或H [「alco」]檢索值。但是,如果我使用正則表達式,我無法正確地得到值。我該怎麼辦?

+0

你想使用哈希鍵來動態構建正則表達式? – holaSenor

回答

5

創建子類,繼承Hash類並覆蓋[]行爲,以便檢查它是否與您的散列中的每個正則表達式匹配並返回相應的值。

+0

只對實例更好地重寫[],不需要子類。 – steenslag

+1

除非他希望使用重寫方法有多個實例。 –

+0

非常感謝! –

6
class MyHash < Hash 
    def [](a) 
    self.select {|k| k =~ a}.shift[1] 
    end 
end 

result = MyHash.new 

result[/^alc/] = "AL" 

puts result['alcohol'] #=> 'AL' 

我會創建一個散列的子類,然後重寫這個方法。這樣,您仍然可以在其他地方保持常規的哈希功能。

+0

你剛剛編碼我的答案。 –

+0

當我編碼時,你發佈了你的答案。我只有在發佈這個消息時纔看到你的答案......還有許多不同的編碼方法。你的實施會不同嗎? –

+0

大概一點點,但會保持相同的概念。像'self.each {| key,value |如果exp =〜key}'則返回值。 –