2013-12-19 37 views
4

我敢肯定,我看到有人不喜歡下面的代碼快捷的技術(不工作)快捷方式,使箱/開關返回值

return case guess 
    when guess > @answer then :high 
    when guess < @answer then :low 
    else :correct 
end 

有誰知道的伎倆我指的是?

+1

只是爲了好玩,你也可以說'{-1 =>:低,0 =>:正確,1 =>:高} [猜<=> @answer]。 –

+0

看起來很瘋狂。我會盡快嘗試。謝謝。 – dwilbank

+0

是的,我不建議你在現實生活中這樣做,這就是爲什麼我沒有把它包含在我的答案中。 –

回答

4

這工作:

return case 
    when guess > @answer ; :high 
    when guess < @answer ; :low 
    else ; :correct 
    end 
+0

的確如此。並不完全是我之前看到的伎倆,但它同樣好!謝謝。 – dwilbank

+0

您不需要在其他分號之後加分號。只是一個挑剔。 –

+0

該操作僅需要從'案例猜測'中刪除單詞猜測。在這個答案中,布爾條件列表中展示的案例形式通常會有'then'而不是';'。看到畝的答案。 –

5

您需要從case刪除guess,因爲它不是有效的Ruby語法。

例如:

def test value 
    case 
    when value > 3 
    :more_than_3 
    when value < 0 
    :negative 
    else 
    :other 
    end 
end 

然後

test 2 #=> :other 
test 22 #=> :more_than_3 
test -2 #=> :negative 

return是隱式的。

編輯:你可以使用then如果你喜歡過,同樣的例子是這樣的:

def test value 
    case 
    when value > 3 then :more_than_3 
    when value < 0 then :negative 
    else :other 
    end 
end 
+0

嗯,''當y ...'在Ruby中是完全有效的情況。問題是有兩種形式的'case',OP對他們正在使用哪一種產品感到困惑。 –

+0

是的,我的意思是你不能像'case x when x> 2'那樣使用它,我犯了一個沒有給出正確的解釋 – NicoSantangelo

12

一個case聲明確實返回一個值,你只需要使用它的正確形式以獲得您期待的價值。

有很多紅寶石case兩種形式。第一個是這樣的:

case expr 
when expr1 then ... 
when expr2 then ... 
else ... 
end 

這將比較expr使用===when表達(這是一個三重BTW),它會執行第一then其中===給出了真正的價值。例如:

case obj 
when Array then do_array_things_to(obj) 
when Hash then do_hash_things_to(obj) 
else raise 'nonsense!' 
end 

相同:

if(Array === obj) 
    do_array_things_to(obj) 
elsif(Hash === obj) 
    do_hash_things_to(obj) 
else 
    raise 'nonsense!' 
end 

case另一種形式只是一堆的布爾條件:

case 
when expr1 then ... 
when expr2 then ... 
else ... 
end 

例如:

case 
when guess > @answer then :high 
when guess < @answer then :low 
else :correct 
end 

是一樣的S:

if(guess > @answer) 
    :high 
elsif(guess < @answer) 
    :low 
else 
    :correct 
end 

您使用的是第一種形式,當你認爲你正在使用的第二種形式,所以你最終會做這樣奇怪的(但語法上有效的)事情:

(guess > @answer) === guess 
(guess < @answer) === guess 

在這兩種情況下, ,case是一個表達式,並返回匹配的分支返回的任何內容。

+0

優秀的答案 – NicoSantangelo

0

上的問題(即看起來好像沒什麼問題的方法)@畝的第一個註釋拿起,你當然也可以寫爲:

return case (guess <=> @answer) 
     when -1 then :low 
     when 0 then :correct 
     when 1 then :high 
     end 

 ... 
     else 
     :high 
     end