[英]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.