繁体   English   中英

Ruby中出现意外的案例行为

[英]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计算结果为falseorg === 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM