簡體   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