[英]Unexpected case behaviour in Ruby
我在代码的一个非常简单的部分(我认为)得到了错误的值:
org = 4
case org
when org <= 1
val = 'L'
when 2..3
val = 'M'
when org >= 4
val = 'H'
end
puts val
=> nil
拜托,不要生气,我希望我错过了一些非常明显的东西,但我真的无法弄明白。 谢谢。
这是一个经典的Ruby错误。 case
有两种被调用的方法,一种是你将一个东西传递给分支的一种方法,另一种是你不需要的方法。
如果您指定的表达case
的语句,那么所有的其他条件进行评估,并与比较===
。 在这种情况下, org <= 1
计算结果为false
而org === false
显然不是真的。 对于所有其他情况也是如此,它们要么是真的,要么是假的。 这意味着它们都不匹配。
如果没有指定的表达,则case
的行为就像一个奇特的if
。
将case org
切换到case
,它的工作原理。 您还可以切换到范围:
val =
case org
when 0..1
'L'
when 2..3
'M'
else
'H'
end
原始代码执行的方式就像是:
org = 4
if (org <= 1) === org
val = 'L'
elsif (2..3) === org
val = 'M'
elsif (org >= 4) === org
val = 'H'
end
这不是你想要的。
作为替代方案,您可以写:
letters = %w(L L M M H)
val = letters[org.clamp(0,4)]
它使用Comparable#clamp
,它随Ruby 2.4一起提供。
对于Ruby 2.3及更早版本,您可以使用:
val = letters[[0, org, 4].sort[1]]
这样,如果org
小于0
或大于4
,那org
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.