# お題
ここに間違ったFizzBuzzのプログラムがあります(fizz_bug.rb)
11.upto(30).each do |num|2 if num % 15 == 03 puts "FizzBuzz"4 next5 elsif num % 5 == 06 puts "Buzz"7 elsif num % 3 == 08 puts "Fizz"9 end1011 puts num12end13
これをbyebugでデバッギングする仕方を説明します。
結果(間違ってます)
11223Fizz43546Buzz758Fizz9610711812Fizz13914Buzz1510161117Fizz18121913201421FizzBuzz2216231724Fizz2518261927Buzz282029Fizz30213122322333Fizz342435Buzz3625372638Fizz39274028412942FizzBuzz43
どうやら、Fizzのあとと、Buzzのあとに余計な数字が出力されています。困った。
byebugとは
https://github.com/deivid-rodriguez/byebug
rubyで使えるデバッガです。
CLIのコマンドも用意されているのですが、byebugライブラリをrequireすると使えるようになるdebugger
メソッドのほうが使いやすいので、この方法を説明します。
インストール
byebugを使うためにはgem installがいります。 (bundlerなどですでに入っているディレクトリだったら要りません)
1gem install byebug2
プログラムを途中で止める
byebugをrequireします
1require 'byebug' # ここ追加231.upto(30).each do |num|4 if num % 15 == 05 puts "FizzBuzz"6 next7 elsif num % 5 == 08 puts "Buzz"9 elsif num % 3 == 010 puts "Fizz"11 end1213 puts num14end15
止めたいところでdebuggerと書きます
1require 'byebug'231.upto(100).each do |num|4 if num % 15 == 05 puts "FizzBuzz"6 next7 elsif num % 5 == 08 puts "Buzz"9 debugger # ここ追加10 elsif num % 3 == 011 puts "Fizz"12 end1314 puts num15end16
ruby fizz_bug.rb
1➜ Desktop ruby fizz_bug.rb21324Fizz53647Buzz89[6, 15] in /Users/user/Desktop/fizz_bug.rb10 6: next11 7: elsif num % 5 == 012 8: puts "Buzz"13 9: debugger14 10: elsif num % 3 == 015 11: puts "Fizz"16 12: end17 13:18=> 14: puts num19 15: end20
プログラムが止まりました。
8行目のputs "Buzz"
が実行されたのでBuzzが表示されています。
本当はここで次のイテレーションを実施したいのですが、Buzz
のあとに5
と表示されてしまっているので、間違ってしまっているみたいです。
ステップ実行してみます
ステップ実行
n
と入力してください。次の行だけ実行できます。
1(byebug) n2534[1, 10] in /Users/user/Desktop/fizz_bug.rb5 1: require 'byebug'6 2:7 3: 1.upto(30).each do |num|8=> 4: if num % 15 == 09 5: puts "FizzBuzz"10 6: next11 7: elsif num % 5 == 012 8: puts "Buzz"13 9: debugger14 10: elsif num % 3 == 015(byebug)16
どうやら14行目のputs n
が実行されて、次のイテレーションに移ってしまったみたいです。
どうやらnext
し忘れたみたいです。
次のdebuggerまで処理をつづける
原因がわかったので、次のループまで飛ばします
c
と入力します。
1(byebug) c2Fizz3647586Fizz798Buzz910[6, 15] in /Users/user/Desktop/fizz_bug.rb11 6: next12 7: elsif num % 5 == 013 8: puts "Buzz"14 9: debugger15 10: elsif num % 3 == 016 11: puts "Fizz"17 12: end18 13:19=> 14: puts num20 15: end21(byebug)2223
c
を押すと、次にdebuggerが仕込まれているところまで処理を実行します。
デバッグをやめる
もう原因がわかっているので、終了します。
1(byebug) exit2➜ Desktop3
完成版
Fizzのあともバグってたので直します。
1require 'byebug'231.upto(30).each do |n|4 if num % 15 == 05 puts "FizzBuzz"6 next7 elsif num % 5 == 08 puts "Buzz"9 next10 elsif num % 3 == 011 puts "Fizz"12 next13 end1415 puts num16end17
ということで完成です。