如何在Ruby中编写switch语句

178 阅读3分钟

那么你如何切换到case/when呢?

Ruby中的case语句是非常强大的。引用流行的《ProgrammingRuby》一书中的话:"Ruby的case表达式是一个强大的野兽:一个多路if的类固醇。"

让我们首先把一个小规模的if表达式转换成一个case/when 语句。下面的if 表达式

if name == "Peter Parker"
  hero_name = "Spiderman"
elsif name == "Bruce Wayne"
  hero_name = "Batman"
else
  hero_name = "unknown"
end

将看起来像这样

case name
when "Peter Parker"
  hero_name = "Spiderman"
when name == "Bruce Wayne"
  hero_name = "Batman"
else
  hero_name = "unknown"
end

重要的关键字

在case语句中,有3个重要的关键字。

  • case :它类似于其他编程语言中的switch关键字。它接收将被when关键字使用的变量。

  • when: 它类似于其他编程语言中的case关键字。它用于匹配一个单一的条件。一个case语句中可以有多个when语句。

  • else: 它类似于其他编程语言中的default关键字。它是可选的,当没有任何条件匹配时就会执行。

case 操作方法是将目标(关键字case后面的表达式)与 关键字后面的每个比较表达式进行比较。这个测试是使用比较 target来完成的。when ===

需要注意的关键区别是,你不再需要编写比较运算符或then 关键字。如果你有其他编程语言的背景,那么你可能也注意到,在Ruby中,你不需要用断句来结束每个单独的案例

Ruby中case/when语句的缩进

关于这一点没有官方的标准,但是开发者倾向于把when 关键字和case 放在同一列。

case bar
when 4 then ...
when 2 then ...
else ...
end

这是很合理的:想想if/elsif 的缩进。

Ruby中的案例/时间。高级使用的...情况

现在是时候看看case表达式的更多高级用例了。在你的when 子句中,你可以做的远不止是单值比较。通过case ,你可以比较范围、类、正则表达式、多值,以及更多。下面是一个综合的例子,说明你可以使用case语句的多种方式。

def switch_me(something)
  case something
  when /^1/ 
    "param starts with one" # return keyword is optional
  when 80..90
    "B+"
  when 50 then "param is 50" #then keyword allows return on same line
  when 10, 20
    "param is either 10 or 20"
  when String
    "You passed a String"
  end
end

在你的Ruby控制台中。

$> switch_me("111")
=> "param starts with one"

$> switch_me(82)
=> "B+"

$> switch_me(50)
=> "param is 50"

$> switch_me(10)
=> "param is either 10 or 20"

$> switch_me("20")
=> "You passed a String"

$> switch_me(42)
=> nil

让我们来看看每个单独的case。

  • 第一个when子句是比较var是否与正则表达式相匹配,就像这样/^1/ === something 。正如你所看到的,比较是在比较的目标之前。

  • 在第二个when子句中,var将被比较到80...90这个范围。

  • 在第三个when子句中,我们做了一个简单的比较,但是我们没有把我们的返回表达式放在下一行,而是使用了then关键字来缩短它。

  • 在第四个when子句中,有多个条件。这些条件中的每一个都将被依次检查。因此,首先10 === var and then 20 === var

最后,在我们的最后一个when子句中,我们检查第一个参数是否是一个String对象。你可能已经注意到,在case 语句之前有一个puts关键字。这是可能的,因为和if一样,case返回最后执行的表达式的值,所以它可以被输入到一个方法调用中。

另一种有趣的方式是像if-else语句一样使用case语句。你不能给case ,如果像这样使用它。

def case_like_ifelse(param1)
  case
  when param1 == 1, param1 == 2
    "param1 is one or two"
  when param1 == 3
    "param1 is three"
  else
    "unknown"
  end
end

在你的Ruby控制台中:

$> case_like_ifelse(1)
=> "param1 is one or two"

$> case_like_ifelse(3)
=> "param1 is three"

$> case_like_ifelse(3)
=> "unknown"

现在你已经准备好在Ruby中编写复杂的开关控制表达式了!