实现'case'语句以匹配多个'when'条件

时间:2011-03-06 21:29:15

标签: ruby-on-rails ruby ruby-on-rails-3 switch-statement conditional-statements

我正在使用Ruby on Rails 3,我想使用case语句,即使在匹配when语句后,也可以继续检查其他when statement,直到最后{{1} }}

例如

else

Ruby中有可能吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:3)

我看到来自ruby的大多数代码都是使用if elsif else完成的,但你可以模仿类似于其他语言的switch逻辑表达式:

case var
when 1
  dosomething
when 2..3
  doSomethingElse
end

case
when var == 1
   doSomething
when var < 12
   doSomethingElse
end

这来自SO Question。就像我说的那样,这通常是用红宝石中的if elsif else完成的,例如:

if my_number == "1"
   #do stuff when equals 1
elsif my_number == "e"
   #same thing here
else
   #default, no case found
end 

答案 1 :(得分:1)

Ruby对case没有任何影响。

另一种选择是使用if方法的一系列===语句,这是case在内部用来比较项目的内容。

has_matched? = false

if '2' === var
  has_matched? = true
  # stuff
end

if '3' === var
  has_matched? = true
  # other stuff
end

if something_else === var
  has_matched? = true
  # presumably some even more exciting stuff
end

if !has_matched?
  # more stuff
end

这有两个明显的问题。

  1. 不是很DRYhas_matched? = true遍布整个地方。

  2. 您始终需要记住将var放在===的右侧,因为这是case在幕后的作用。

    < / LI>

    您可以使用matches?方法创建自己的类,该方法封装了此功能。它可以有一个构造函数,它接受你将要匹配的值(在这种情况下,var),并且它可以有一个else_do方法,只有在其内部{{1}时才执行它的块实例变量仍为假。

    修改

    @has_matched?方法可能意味着您想要的任何意思。通常,在两个对象之间测试等效性是一种更“宽容”的方式。以下是此this page的示例:

    ===

    基本上,当Ruby遇到class String def ===(other_str) self.strip[0, other_str.length].downcase == other_str.downcase end end class Array def ===(str) self.any? {|elem| elem.include?(str)} end end class Fixnum def ===(str) self == str.to_i end end 时,它会在对象上调用case var与您进行比较===