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