2017-04-21 58 views
0

下面的程序輸出歌曲「99瓶啤酒」的歌詞。三元操作器輸出錯誤時的True Option

當歌曲達到只剩1瓶的地步時,它使用單數形式的「瓶子」。爲了適應這種情況,我使用三元運算符在任何特定時刻選擇正確的案例。

但是,當beer_bottles count在我的程序中達到1時,即使明確表示三元運算符評估爲false,最後一句仍然輸出「bottles」。

我在IRB中用beer_bottles = 1測試了三元運算符,它正確地輸出了錯誤的選項:「bottle」。

幫助理解爲什麼發生這種情況非常感謝!

beer_bottles = 99 

while beer_bottles >= 2 do 
    plural = "bottles" 

    singular = "bottle" 

    plural_or_singular = beer_bottles > 1 ? plural : singular 

    puts "#{beer_bottles} #{plural_or_singular} of beer on the wall, #{beer_bottles} #{plural_or_singular} of beer." 

    beer_bottles -= 1 

    puts "BOTTLE COUNT: #{beer_bottles}" 

    puts "Take one down and pass it around, #{beer_bottles} #{plural_or_singular} of beer on the wall." 
end 
+1

問:你確定你確實在這一點踏踏實實爲「1」?問:你應該移動三元*後*減量? – paulsm4

+2

您將while循環停在2.在減去一個之後,您不重新計算'plural_or_singular'。你應該進一步向下移動。 –

回答

2

最安全的事情是此刻的你輸出變量檢查。在打印最後一行之前,您可以簡單地移動三元組。

我會試圖將它提取到一個單獨的方法。實際上,這是Rails與pluralize所做的一樣。我們可以創造我們自己的簡化版:

def pluralize(count, noun) 
    "#{count} #{count==1 ? noun : noun + 's'}" 
end 

然後你的代碼可能是這樣的:

99.downto(1) do |n| 
    puts "#{pluralize(n, "bottle")} of beer on the wall, #{pluralize(n, "bottle")} of beer." 
    puts "Take one down and pass it around, #{pluralize(n-1, "bottle")} of beer on the wall." 
end 
+0

Ayy!使用'.downto'和一個自定義的方法更清潔,謝謝! – Edson

1

你是不是又beer_bottles -= 1作爲beer_bottles得到了更新後計算plural_or_singular

解決方案:

beer_bottles = 99 

while beer_bottles >= 2 do 
    plural = "bottles" 

    singular = "bottle" 

    plural_or_singular = beer_bottles > 1 ? plural : singular 

    puts "#{beer_bottles} #{plural_or_singular} of beer on the wall, #{beer_bottles} #{plural_or_singular} of beer." 

    beer_bottles -= 1 
    plural_or_singular = beer_bottles > 1 ? plural : singular 
    puts "BOTTLE COUNT: #{beer_bottles}" 

    puts "Take one down and pass it around, #{beer_bottles} #{plural_or_singular} of beer on the wall." 
end 
+2

第一次檢查現在完全沒有必要。 –

+0

啊,是的!出於某種原因,我認爲每次我插入它時都會計算'plural_or_singular'。 Woops!謝謝馬克! – Edson