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

链接地址: http://www.djcxy.com/p/639.html

上一篇: How to write a switch statement in Ruby?

下一篇: In the shell, what does " 2>&1 " mean?