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