2012-05-25 44 views
2
x='bob' 
case x 
when "bob" 
puts 'it stops here' 
when 'bob' 
puts 'but i want it to stop here' 
end 

有沒有辦法讓case語句像vanilla switch一樣?這樣它纔會在爆發之前循環所有的「什麼時候的」?我很驚訝ruby的行爲幾乎與elsif一樣。Ruby刪除Case語句中的隱式斷點? (如何製作像Switch這樣的案例)

+0

那不是等同於堆疊(未嵌套)如果塊? –

+3

也許一個不太人爲的例子會有所幫助。你應該使用正確的工具來完成這項工作,而我猜測'case'不是它。 –

+0

我想證明switch會同時執行'puts'。在滿足第一個條件後,「case」發生在「停在這裏」。堆疊如果塊是替代品,但不是超過一行的漂亮。 –

回答

5

邁克爾,

雖然你的例子是有點誤導,你就可以使用簡單的(「鮑勃」兩個「鮑勃」和「鮑勃」,所以第一種情況下將始終與匹配),如果就像在下面if_test方法:

def case_test(x)             
    puts case 
    when x > 3 
    "ct: #{x} is over 3" 
    when x > 4 
    "ct: #{x} is over 4" 
    end 
end  

case_test(4) 
case_test(5) 

def if_test(x) 
    puts "it: #{x} is over 3" if x > 3 
    puts "it: #{x} is over 4" if x > 4 
end  

if_test(4) 
if_test(5) 

這產生了:

ct: 4 is over 3 
ct: 5 is over 3 
it: 4 is over 3 
it: 5 is over 3 
it: 5 is over 4 

請注意,您還可以使用多個語句與when,這可能會幫助你或不取消等候您的實際使用情況:

def many(x)    
    case x     
    when 'alice','bob'  
    puts "I know #{x}" 
    else·     
    puts "I don't know #{x}"          
    end      
end      

many('alice')    
many('bob') 
many('eve') 

產量:

I know alice 
I know bob 
I don't know eve 
+2

誤導性 - 它是故意完成的。我在問是否有開關選擇。或者無論如何要做個案:當行爲像一個開關(不要在第一次發現案件後發生)。這是一篇很棒的文章,很明顯,你花了很多時間,我會在週末讓它燉。如果沒有其他答案,我會接受。 –

+0

好吧,邁克爾,我明白了。所以可能你希望文本是'但我也想在這裏停止'。 – leucos

+0

是的,我認爲讓它循環遍歷所有條件也是有用的。我一直在堆疊如果塊,但它不是很好。 –

2

編號案例陳述評估第一個when塊,其目標的===方法在通過比較時評估爲true,並在此處停止。

+0

我認爲ruby應該提供另一個案例/當它像C中的開關/案例一樣工作。 –