11

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

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 语句只评估第一个真正的条件块,有没有办法覆盖它来评估每个真正的块,除非有中断?

4

3 回答 3

21

您还可以使用 lambda:

case cool_hash
when -> (h) { h[:key] == 'something' }
  puts 'something'
else
  puts 'something else'
end
于 2015-03-26T19:11:27.803 回答
6

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

case

但是,无法覆盖 case 语句来评估多个块。我认为您想要的是使用if语句。代替 a 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
于 2013-06-26T17:36:35.740 回答
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 的 else 部分,如果有更多条件,您也可以使用 'case cool_hash[:crazy_option]' 而不是 'if'。在这种情况下,我更喜欢你使用“if”,因为只有一个条件。

于 2013-06-27T05:40:18.953 回答