2017-04-21 10 views
0

以下のプログラムは、 "99 Bottles of Beer"の歌詞を出力します。3進演算子Falseの場合にTrueオプションを出力する

残っているボトルが1つしかないところに曲が到達すると、ボトルの単数形が使用されます。これに対応するために、私は三項演算子を使用して任意の時点で正しい場合を選択しました。それは三項演算子はfalseと評価さは明らかだ場合でも、しかし

beer_bottlesカウントは私のプログラムで1に達し、最後の文はまだ、「ボトル」を出力します。

IRBの3進演算子をbeer_bottles = 1でテストしたところ、誤ったオプション:「ボトル」が正しく出力されました。

これがなぜ発生するのか理解していただければ幸いです。

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

Q:あなたは、あなたが実際にその時点で「1」に取り掛かりますか? Q:3桁を* AFTER *減分する必要がありますか? – 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 -= 1beer_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'が私がそれを補間するたびに計算されていると仮定しました。うわー!感謝の印! – Edson

関連する問題