case 语句

Ruby 使用 case 关键字作为 switch 语句。

根据 Ruby Docs

case 语句由一个可选条件组成,该条件位于 case 的参数位置,以及零个或多个 when 子句。匹配条件的第一个 when 子句(或者如果条件为 null 则评估为布尔真值)wins,并执行其代码节。case 语句的值是成功的 when 子句的值,如果没有这样的子句,则为 nil

case 语句可以以 else 条款结束。每个 when 语句可以有多个候选值,用逗号分隔。

例:

case x
when 1,2,3
  puts "1, 2, or 3"
when 10
  puts "10"
else
  puts "Some other number"
end

更短的版本:

case x
when 1,2,3 then puts "1, 2, or 3"
when 10 then puts "10"
else puts "Some other number"
end

case 子句的值使用 === 方法(不是 ==)与每个 when 子句匹配。因此,它可以与各种不同类型的对象一起使用。

一个 case 语句可以与 Ranges 一起使用 :

case 17
when 13..19
  puts "teenager"
end

case 语句可以与 Regexp 一起使用 :

case "google"
when /oo/
  puts "word contains oo"
end

case 语句可以与 Proc 或 lambda 一起使用:

case 44
when -> (n) { n.even? or n < 0 }
  puts "even or less than zero"
end

case 语句可以与一起使用 :

case x
when Integer
  puts "It's an integer"
when String
  puts "It's a string"
end

通过实现 === 方法,你可以创建自己的匹配类:

class Empty
  def self.===(object)
    !object or "" == object
  end
end

case ""
when Empty
  puts "name was empty"
else
  puts "name is not empty"
end

可以使用 case 语句而不使用值来匹配:

case
when ENV['A'] == 'Y'
  puts 'A'
when ENV['B'] == 'Y'
  puts 'B'
else
  puts 'Neither A nor B'
end

case 语句有一个值,因此你可以将其用作方法参数或赋值:

description = case 16
              when 13..19 then "teenager"
              else ""
              end