2012-06-27 43 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}'则返回值。 –