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