这听起来很奇怪,但我很乐意做这样的事情:
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语句只评估第一个真正的条件块,有没有办法覆盖它来评估每个块是否为真,除非有中断?
答案 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',因为只有一个条件。