我正在使用Ruby on Rails 3,我想使用case
语句,即使在匹配when
语句后,也可以继续检查其他when statement
,直到最后{{1} }}
例如
else
端
Ruby中有可能吗?如果是这样,怎么样?
答案 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
这有两个明显的问题。
不是很DRY:has_matched? = true
遍布整个地方。
您始终需要记住将var
放在===
的右侧,因为这是case
在幕后的作用。
您可以使用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
,与您进行比较===
。