那么你如何切换到case/when呢?
Ruby中的case语句是非常强大的。引用流行的《ProgrammingRuby》一书中的话:"Ruby的case表达式是一个强大的野兽:一个多路if的类固醇。"
让我们首先把一个小规模的if表达式转换成一个case/when 语句。下面的if 表达式
if name == "Peter Parker"
hero_name = "Spiderman"
elsif name == "Bruce Wayne"
hero_name = "Batman"
else
hero_name = "unknown"
end
将看起来像这样
case name
when "Peter Parker"
hero_name = "Spiderman"
when name == "Bruce Wayne"
hero_name = "Batman"
else
hero_name = "unknown"
end
重要的关键字
在case语句中,有3个重要的关键字。
-
case:它类似于其他编程语言中的switch关键字。它接收将被when关键字使用的变量。 -
when: 它类似于其他编程语言中的case关键字。它用于匹配一个单一的条件。一个case语句中可以有多个when语句。 -
else: 它类似于其他编程语言中的default关键字。它是可选的,当没有任何条件匹配时就会执行。
case 操作方法是将目标(关键字case后面的表达式)与 关键字后面的每个比较表达式进行比较。这个测试是使用比较 target来完成的。when ===
需要注意的关键区别是,你不再需要编写比较运算符或then 关键字。如果你有其他编程语言的背景,那么你可能也注意到,在Ruby中,你不需要用断句来结束每个单独的案例。
Ruby中case/when语句的缩进
关于这一点没有官方的标准,但是开发者倾向于把when 关键字和case 放在同一列。
case bar
when 4 then ...
when 2 then ...
else ...
end
这是很合理的:想想if/elsif 的缩进。
Ruby中的案例/时间。高级使用的...情况
现在是时候看看case表达式的更多高级用例了。在你的when 子句中,你可以做的远不止是单值比较。通过case ,你可以比较范围、类、正则表达式、多值,以及更多。下面是一个综合的例子,说明你可以使用case语句的多种方式。
def switch_me(something)
case something
when /^1/
"param starts with one" # return keyword is optional
when 80..90
"B+"
when 50 then "param is 50" #then keyword allows return on same line
when 10, 20
"param is either 10 or 20"
when String
"You passed a String"
end
end
在你的Ruby控制台中。
$> switch_me("111")
=> "param starts with one"
$> switch_me(82)
=> "B+"
$> switch_me(50)
=> "param is 50"
$> switch_me(10)
=> "param is either 10 or 20"
$> switch_me("20")
=> "You passed a String"
$> switch_me(42)
=> nil
让我们来看看每个单独的case。
-
第一个when子句是比较var是否与正则表达式相匹配,就像这样
/^1/ === something。正如你所看到的,比较是在比较的目标之前。 -
在第二个when子句中,var将被比较到80...90这个范围。
-
在第三个when子句中,我们做了一个简单的比较,但是我们没有把我们的返回表达式放在下一行,而是使用了then关键字来缩短它。
-
在第四个when子句中,有多个条件。这些条件中的每一个都将被依次检查。因此,首先
10 === var and then 20 === var。
最后,在我们的最后一个when子句中,我们检查第一个参数是否是一个String对象。你可能已经注意到,在case 语句之前有一个puts关键字。这是可能的,因为和if一样,case返回最后执行的表达式的值,所以它可以被输入到一个方法调用中。
另一种有趣的方式是像if-else语句一样使用case语句。你不能给case ,如果像这样使用它。
def case_like_ifelse(param1)
case
when param1 == 1, param1 == 2
"param1 is one or two"
when param1 == 3
"param1 is three"
else
"unknown"
end
end
在你的Ruby控制台中:
$> case_like_ifelse(1)
=> "param1 is one or two"
$> case_like_ifelse(3)
=> "param1 is three"
$> case_like_ifelse(3)
=> "unknown"
现在你已经准备好在Ruby中编写复杂的开关控制表达式了!