case 语句使用 === 匹配运算符,将 case 表达式的结果与 when 表达式的每个结果进行匹配。when 子句的数量可以是任意的,但是只计算第一个匹配 when 子句主体的值。如果没有匹配的 when 子句,然而程序员提供了 else 子句,则会对 else 子句的主体进行求值。如果既没有匹配的 when 子句,又没有 else 子句,则 case 表达式将返回空值。
case degrees_in_kelvin when 0..273 puts "solid" when 274..372 puts "liquid" else puts "gas" end
case...when..else..end 结构决定了 === 方法的匹配行为。从 Object 继承的缺省 === 方法是一个使用 equal? 进行的等同性测试,equal? 可执行严格的对象等同性操作。但是,此方法是作为别名实现的,因此,在子类上重新定义 equals? 方法并不会改变所继承的缺省 === 方法的行为。
很多核心类(如 RegExp 和 Range)都提供了 === 方法,它可匹配整个对象组。
case "hello" when /^ye/ puts "yee-haw" when /^he/ puts "hee-haw" end
在执行匹配时,when 表达式中的对象是调用方,case 表达式中的对象是参数。在上面的示例中,成功找到了以下表达式的匹配项:/^he/ === "hello"。
与大多数 Ruby 特殊窗体类似,case...when...else...end 表达式返回其结果。这是在块内进行求值的最后一个表达式的结果。
puts case x
when 0...10
puts "this is not the value"
0 # but this will be if x is in between 0 and 10
when 10...100
1
when 100...1000
2
end