如何在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此语法不再允许。)