协慌网

登录 贡献 社区

如何在 Ruby 中编写 switch 语句?

如何在 Ruby 中编写 switch 语句?

答案

Ruby 使用case表达式

case x
when 1..5
  "It's between 1 and 5"
when 6
  "It's 6"
when "foo", "bar"
  "It's either foo or bar"
when String
  "You passed a string"
else
  "You gave me #{x} -- I have no idea what to do with that."
end

Ruby 使用===运算符将when子句中的对象与case子句中的对象进行比较。例如, 1..5 === x ,而不是x === 1..5

这允许复杂的when子句如上所示。可以测试范围,类和各种事物而不仅仅是平等。

与许多其他语言中的switch语句不同,Ruby 的case并没有落空 ,所以没有必要在break when结束每个语句。您还可以在单​​个when子句中指定多个匹配项,例如when "foo", "bar"

case...when处理类时出现意外行为。这是因为它使用了===运算符。

该运算符按预期使用文字,但不使用类:

1 === 1           # => true
Fixnum === Fixnum # => false

这意味着如果你想做一个case ... when在一个对象的类上时,这将不起作用:

obj = 'hello'
case obj.class
when String
  print('It is a string')
when Fixnum
  print('It is a number')
else
  print('It is not a string')
end

将打印 “它不是一个字符串”。

幸运的是,这很容易解决。已定义===运算符,以便在将其与类一起使用时返回true ,并将该类的实例作为第二个操作数提供:

Fixnum === 1 # => true

简而言之,可以通过删除.class来修复上面的代码:

obj = 'hello'
case obj  # was case obj.class
when String
  print('It is a string')
when Fixnum
  print('It is a number')
else
  print('It is not a string')
end

我今天在寻找答案时遇到了这个问题,这是第一个出现的页面,所以我认为在同样的情况下对其他人有用。

它是由 Ruby 中的case完成的。另请参阅Wikipedia 上的这篇文章

引:

case n
when 0
  puts 'You typed zero'
when 1, 9
  puts 'n is a perfect square'
when 2
  puts 'n is a prime number'
  puts 'n is an even number'
when 3, 5, 7
  puts 'n is a prime number'
when 4, 6, 8
  puts 'n is an even number'
else
  puts 'Only single-digit numbers are allowed'
end

另一个例子:

score = 70

result = case score
   when 0..40 then "Fail"
   when 41..60 then "Pass"
   when 61..70 then "Pass with Merit"
   when 71..100 then "Pass with Distinction"
   else "Invalid Score"
end

puts result

Ruby Programming Lanugage (第 1 版,O'Reilly)的第 123 页(我正在使用 Kindle)上,它表示在when子句后面的then关键字可以用换行符或分号替换(就像在if then else语法中一样) )。 (红宝石 1.8 还允许在地方的一个冒号then ...... 但是在 Ruby 1.9 此语法不再允许。)