类似哈希的对象,其作用类似于case语句

时间:2014-08-16 04:59:21

标签: ruby hash switch-statement

构造类似哈希的类Case的最佳方法是什么,它由哈希初始化:

cs = Case.new(:a => 1, /b/ => 2, /c/ => 2, /d/ => 3)

并且有一个方法Case#[],它通过===(如case语句)而不是==(与传统哈希)一样查找第一个匹配键并返回值:

cs["xxb"] => 2

1 个答案:

答案 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