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

case 文は、=== 照合演算子を使用した when 式の各結果に対する case 式の結果を照合します。when 節はいくつもある場合がありますが、最初の一致部分しか評価されません。when 節に一致するものがなく、プログラマが else 節をつけている場合、その部分が評価されます。一致も else 節もない場合、case 式は nil を戻します。

 case degrees_in_kelvin
 when 0..273
   puts "solid"
 when 274..372
   puts "liquid"
 else

   puts "gas"
 end

case...when..else..end 構文は、=== メソッドを使用して一致を判定します。オブジェクトから継承されたデフォルトの === メソッドは、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 # しかし、x が 0 から 10 の間の場合にこうなる
      when 10...100
        1
      when 100...1000
        2
      end