2011-02-25 66 views
43

你能用紅寶石做到這一點嗎? 似乎「小姐」的情況下,與不平等如何使用紅寶石「案件......何時」有不平等?

case myvar 
when myvar < -5 
    do somethingA 
when -5..-3 
    do special_something_XX 
when -2..-1 
    do special_something_YY 
when myvar == 0 
    do somethingB 
when myvar > 0 
    go somethingC 
end 
+0

您可以使用正則表達式來捕捉不同的情況,而不是 – Flexo 2011-02-25 07:13:18

+0

@Flexo:請問您的意見ach處理科學記數法? – 2011-02-25 07:40:16

回答

86

你混合兩種不同類型的case語句:

case var 
when 1 
    dosomething 
when 2..3 
    doSomethingElse 
end 

case 
when var == 1 
    doSomething 
when var < 12 
    doSomethingElse 
end 
+0

謝謝,這對我有幫助,相對新手! – jpwynn 2011-02-25 09:01:04

+9

哇,這一次我沒有意識到第二種類型的存在。謝謝。 – 2011-02-25 12:27:00

+0

eli5寫滿了!我最喜歡的解釋:) – Mark 2017-09-02 12:40:49

7

我沒有親自相信你不會用if語句更好,但如果你想以這種形式的解決方案:

Inf = 1.0/0 

case myvar 
when -Inf..-5 
    do somethingA 
when -5..-3 
    do special_something_XX 
when -2..-1 
    do special_something_YY 
when 0 
    do somethingB 
when 0..Inf 
    do somethingC 
end 

我的首選解決方案如下。這裏的順序很重要,你必須重複myvar,但是更難排除的情況下,你不必重複每次約束兩次,嚴格(< vs <=而不是.. vs ...)更明顯。

if myvar <= -5 
    # less than -5 
elsif myvar <= -3 
    # between -5 and -3 
elsif myvar <= -1 
    # between -3 and -1 
elsif myvar <= 0 
    # between -1 and 0 
else 
    # larger than 0 
end 
+0

也非常有幫助謝謝! – jpwynn 2011-02-25 09:01:22

+0

我個人認爲,第二種選擇更清晰的是評論,而不是使用if-elsif而不是case-when的事實。也就是說,我更喜歡if-elsif,但僅僅因爲它更短。 – kikito 2011-02-25 10:06:49

24
case myvar 
    when proc { |n| n < -5 } 
     do somethingA 
    when -5..-3 
     do special_something_XX 
    when -2..-1 
     do special_something_YY 
    when proc { |n| n == 0 } 
     do somethingB 
    when proc { |n| n > 0 } 
     go somethingC 
    end 
    end 
+8

一些解釋和鏈接本來不錯。 – 2012-12-11 07:35:00

4
def project_completion(percent) 
case percent 
    when percent..25 
    "danger" 
    when percent..50 
    "warning" 
    when percent..75 
    "info" 
    when percent..100 
    "success" 
    else 
    "info" 
    end 
end 
1

使用infinity可以幫助

case var 
when -Float::INFINITY..-1 
when 0 
when 1..2 
when 3..Float::INFINITY 
end