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

A instrução case estabelece a correspondência da expressão case com cada um dos resultados da expressão when usando o operador de correspondências ===. Pode haver várias cláusulas when, mas somente o corpo da primeira correspondência é avaliado. Se nenhuma cláusula when corresponder e o programador tiver que proporcionar a cláusula else, este corpo será avaliado. Se não houver nenhuma correspondência e nenhuma cláusula else, a expressão case retorna zero.

 case graus_em_kelvin
 when 0..273
   puts "sólido"
 when 274..372
   puts "líquido"
 else

   puts "gás"
 end

A construção case...when..else..end determina a correspondência com o método ===. O método herdado === padrão de Object é um teste de igualdade que usa equal? que realiza igualdade estrita de objetos. Este método é implementado como um alias. No entanto, a redefinição do método equals? em uma subclasse não alterará o comportamento do método === herdado padrão.

Muitas classes de núcleo como RegExp e Range oferecem os métodos === que estabelecem a correspondência de grupos inteiros de objetos.

 case "olá"
 when /^ye/
   puts "yee-haw"    
 when /^he/
   puts "hee-haw"
 end

Quando a correspondência é realizada, o objeto da expressão when é o invocante e o objeto da expressão case é o argumento. No exemplo acima, a correspondência bem-sucedida é atingida com a seguinte expressão: /^he/ === "olá".

Como a maioria das formas especiais do Ruby, a expressão case...when...else...end retorna seu resultado. O resultado da última expressão avaliada dentro do bloco será

 puts case x
      when 0...10
        puts "isto não é um valor"
        0 # mas será se x estiver entre 0 e 10
      when 10...100
        1
      when 100...1000
        2
      end