哈希上的Ruby case语句?

时间:2013-06-26 17:32:30

标签: ruby hash branch case-statement

这听起来很奇怪,但我很乐意做这样的事情:

case cool_hash
  when cool_hash[:target] == "bullseye" then do_something_awesome
  when cool_hash[:target] == "2 pointer" then do_something_less_awesome
  when cool_hash[:crazy_option] == true then unleash_the_crazy_stuff
  else raise "Hell"
end

理想情况下,我甚至不需要再次引用has,因为它是case语句的内容。如果我只想使用一个选项,那么我会“case cool_hash [:that_option]”,但我想使用任意数量的选项。另外,我知道Ruby中的case语句只评估第一个真正的条件块,有没有办法覆盖它来评估每个块是否为真,除非有中断?

3 个答案:

答案 0 :(得分:16)

你也可以使用lambda:

case cool_hash
when -> (h) { h[:key] == 'something' }
  puts 'something'
else
  puts 'something else'
end

答案 1 :(得分:4)

您的代码非常接近有效的ruby代码。只需删除第一行的变量名称,将其更改为:

case

但是,没有办法覆盖case语句来评估多个块。我想你想要的是使用if语句。您可以使用break跳出该方法,而不是return

def do_stuff(cool_hash)
  did_stuff = false

  if cool_hash[:target] == "bullseye"
    do_something_awesome
    did_stuff = true
  end

  if cool_hash[:target] == "2 pointer"
    do_something_less_awesome
    return  # for example
  end

  if cool_hash[:crazy_option] == true
    unleash_the_crazy_stuff
    did_stuff = true
  end

  raise "hell" unless did_stuff
end

答案 2 :(得分:4)

我认为,以下是更好的方法来做你想要的东西。

def do_awesome_stuff(cool_hash)
  case cool_hash[:target]
    when "bullseye"
      do_something_awesome
    when "2 pointer"
      do_something_less_awesome
    else
     if cool_hash[:crazy_option]
      unleash_the_crazy_stuff
     else
      raise "Hell"
     end
  end
end

即使在其他情况下,如果有更多条件,你可以使用'case cool_hash [:crazy_option]'而不是'if'。在这种情况下,我更喜欢你使用'if',因为只有一个条件。