我敢肯定,我看到有人不喜歡下面的代碼快捷的技術(不工作)快捷方式,使箱/開關返回值
return case guess
when guess > @answer then :high
when guess < @answer then :low
else :correct
end
有誰知道的伎倆我指的是?
我敢肯定,我看到有人不喜歡下面的代碼快捷的技術(不工作)快捷方式,使箱/開關返回值
return case guess
when guess > @answer then :high
when guess < @answer then :low
else :correct
end
有誰知道的伎倆我指的是?
這工作:
return case
when guess > @answer ; :high
when guess < @answer ; :low
else ; :correct
end
的確如此。並不完全是我之前看到的伎倆,但它同樣好!謝謝。 – dwilbank
您不需要在其他分號之後加分號。只是一個挑剔。 –
該操作僅需要從'案例猜測'中刪除單詞猜測。在這個答案中,布爾條件列表中展示的案例形式通常會有'then'而不是';'。看到畝的答案。 –
您需要從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
嗯,''當y ...'在Ruby中是完全有效的情況。問題是有兩種形式的'case',OP對他們正在使用哪一種產品感到困惑。 –
是的,我的意思是你不能像'case x when x> 2'那樣使用它,我犯了一個沒有給出正確的解釋 – NicoSantangelo
一個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
是一個表達式,並返回匹配的分支返回的任何內容。
優秀的答案 – NicoSantangelo
上的問題(即看起來好像沒什麼問題的方法)@畝的第一個註釋拿起,你當然也可以寫爲:
return case (guess <=> @answer)
when -1 then :low
when 0 then :correct
when 1 then :high
end
或
...
else
:high
end
只是爲了好玩,你也可以說'{-1 =>:低,0 =>:正確,1 =>:高} [猜<=> @answer]。 –
看起來很瘋狂。我會盡快嘗試。謝謝。 – dwilbank
是的,我不建議你在現實生活中這樣做,這就是爲什麼我沒有把它包含在我的答案中。 –