0

「99本のボトル」プログラムを試みています。単純化しようとしましたが、「文字列をFixnumに強制することはできません」というメッセージが表示されました。

num_at_start = 99
num_now = num_at_start         
bobo = " bottles of beer on the wall"
bob = " bottles of beer!"
while num_now > 2
  puts num_now.to_s + bobo.to_s    
  puts num_now.to_s + bob.to_s
  puts num_at_start.to_i - 1 + bobo.to_s
  gets
end
4

2 に答える 2

2

問題はここにあります:

puts num_at_start.to_i - 1 + bobo.to_s

Ruby は、引数がインタープリターに渡されると、結果の式の型を左から右に提案します。ここでは、2 つの整数を合計して、結果を整数にしようとしています。オペランドとして のFixnum#+インスタンスが必要ですが、そこに が来ます。Fixnumbobo.to_sString

ここでは inplace eval を使用する必要があります。

puts "#{num_at_start - 1}#{bobo}"

ループ全体whileは、実際には次のように記述します。

while num_now > 2
  puts "#{num_now}#{bobo}"

  puts "#{num_now}#{bob}"
  puts "#{num_at_start - 1}#{bobo}"
  gets
end

ところで、別の問題があります。無限ループです。ただし、現在動作するコードを取得した後、このエラーを修正するのはあなた次第です。

于 2013-12-24T05:08:09.350 に答える
0

コードの書き方は次のとおりです。

BOBO = '%d bottles of beer on the wall'
BOB = '%d bottles of beer!'

num_at_start = 2
while num_at_start > 0
  bobo_str ||= BOBO % num_at_start
  puts bobo_str
  puts BOB % num_at_start
  puts 'Take one down and pass it around'
  num_at_start -= 1

  bobo_str = BOBO % num_at_start
  puts bobo_str
  puts
end

どの出力:

# >> 2 bottles of beer on the wall
# >> 2 bottles of beer!
# >> Take one down and pass it around
# >> 1 bottles of beer on the wall
# >> 
# >> 1 bottles of beer on the wall
# >> 1 bottles of beer!
# >> Take one down and pass it around
# >> 0 bottles of beer on the wall
# >> 

私が別の方法で行ったことがいくつかあります。

  • BOBOとなり、BOB文字列形式になりました。説明については、 String#%およびKernel#sprintfのドキュメントを参照してください。
  • やる意味がないnum_now = num_at_start。で作業するだけnum_at_startです。
  • 値が 0 より大きい間、ループ テストをトリガーする必要があるため、それを反映するように条件を記述します。そうしないと、後でコードに取り組むあなたや他の人を混乱させることになります。
  • bobo_str ||= BOBO % num_at_startbobo_str設定されていない場合の初期化の簡単な方法です。||=基本的に「設定されていない限り割り当て」です。

ループを使用する代わりに、whileRuby のdownto.

2.downto(1) do |num_at_start|
  bobo_str ||= BOBO % num_at_start
  puts bobo_str
  puts BOB % num_at_start
  puts 'Take one down and pass it around'

  bobo_str = BOBO % (num_at_start - 1)
  puts bobo_str
  puts
end
于 2013-12-24T06:00:01.210 に答える