我在代码的一个非常简单的部分(我认为)中得到了错误的值:
org = 4
case org
when org <= 1
val = 'L'
when 2..3
val = 'M'
when org >= 4
val = 'H'
end
puts val
=> nil
拜托,不要生气,我希望我错过了一些非常明显的东西,但我真的无法弄明白。 谢谢。
答案 0 :(得分:7)
这是一个经典的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
这不是你想要的。
答案 1 :(得分:2)
作为替代方案,你可以写:
new_job=queue(a) # queue(a) is your original function, which returns 2-element lists like ['101', 40]
list_queue.append(new_job)
list_queue.sort(key=lambda a,b: return a[1]<b[1])
它使用了Ruby 2.4附带的Comparable#clamp
。
对于Ruby 2.3及更早版本,您可以使用:
letters = %w(L L M M H)
val = letters[org.clamp(0,4)]
这样,如果val = letters[[0, org, 4].sort[1]]
小于org
或大于0
,则可以。