case...when...else...end

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