构造类似哈希的类Case
的最佳方法是什么,它由哈希初始化:
cs = Case.new(:a => 1, /b/ => 2, /c/ => 2, /d/ => 3)
并且有一个方法Case#[]
,它通过===
(如case语句)而不是==
(与传统哈希)一样查找第一个匹配键并返回值:
cs["xxb"] => 2
答案 0 :(得分:2)
这是一种可能性。
class Case
def initialize(h)
@h = h
end
def [](key,order=:PRE)
case order
when :PRE
h[@h.keys.find { |k| key === k }]
when :POST
h[@h.keys.find { |k| k === key }]
else
# raise exception
end
end
end
cs = Case.new(:a => 1, /b/ => 2, /c/ => 2, [1,2] => "cat", /d/ => 3)
cs["xxb"] #=> nil
cs["xxb",:POST] #=> 2
cs[Regexp] #=> 2
cs[Regexp,:POST] #=> nil
cs[Array] #=> "cat"
cs[Symbol] #=> 1
这假设h
没有密钥nil
。
<小时/> 理解为散列中的键位于
===
的左侧,代码为:
class Case
def initialize(h) @h = h end
def [](key) h[@h.keys.find{|k| k === key}] end
end