初心者でも分かる!Rubyデバッグの7つのステップ

Rubyデバッグの解説図Ruby
この記事は約8分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

プログラミングにおいて、コードが予期せぬ動作をしたり、エラーが発生したりした時、それを修正する過程を「デバッグ」と言います。

この記事を読めば、プログラミング言語Rubyでのデバッグ方法を理解し、自分のコードの問題点を見つけて修正することができるようになります。

●Rubyとは

Rubyは、より簡潔で自然に近いプログラミングを可能にするために設計された、高水準で汎用性のあるプログラミング言語です。

Rubyは動的型付け、ガベージコレクション、そしてすべてがオブジェクトであるという原則を持っています。

●デバッグとは

デバッグは、プログラムが予期しない動作をする原因を特定し、それを修正する作業のことを指します。

エラーメッセージの読み解き、問題のある箇所の特定、問題の解消などが含まれます。

デバッグ能力は、エンジニアの技術力を大きく左右する重要なスキルの一つです。

●Rubyのデバッグ手順の基本

Rubyでのデバッグをスムーズに進めるためには、次の手順を順に行っていきます。

○開始前の準備

まず、エディタの設定やテスト環境の構築など、デバッグを始める前の準備を整えましょう。

これにより、エラーが発生した時にすぐにデバッグを開始することができます。

# Rubyのバージョンを確認
ruby -v

○エラーメッセージの理解

Rubyのエラーメッセージは非常に読みやすいものになっています。

エラーメッセージから、何が問題でどこに問題があるのかを理解しましょう。

# メソッド名のスペルミスでエラーが発生した場合
undefined method `heloo' for main:Object (NoMethodError)

○putsデバッグの使用

最も基本的なデバッグ方法の一つが「putsデバッグ」です。

これは、コードの中にputsを挿入し、特定の変数の値やメソッドの戻り値を出力して確認する方法です。

def add(a, b)
  puts "a: #{a}, b: #{b}" # この行を追加
  a +

 b
end

add(1, 2)

上記のコードでは、addメソッドに渡される引数aとbの値を確認することができます。

出力結果は “a: 1, b: 2” となります。

○debuggerの使用

debuggerを使用すると、プログラムの途中で一時停止させて、その時点での変数の値などを確認することができます。

これにより、コードのどの部分で問題が発生しているのかを特定することが容易になります。

require 'debug' # debuggerを使用するために必要

def add(a, b)
  debugger # この行を追加
  a + b
end

add(1, 2)

上記のコードを実行すると、debuggerの行でプログラムが停止し、デバッグモードに入ります。

この時点で、変数aとbの値を調べることができます。

○複雑なエラーの追跡

複雑なエラーが発生した場合、それがどのメソッドのどの行で発生したのかを特定するためには、スタックトレースを読むスキルが必要です。

スタックトレースは、エラーが発生した際に出力される情報のことで、エラーが発生した順序と場所を表しています。

○テストを使ったデバッグ

テストを書くことで、コードが期待通りに動作することを確認しながら、バグを見つけて修正することができます。

特に単体テスト(ユニットテスト)は、コードの各部分が正しく動作することを検証します。

○その他のツール

Rubyには、高度なデバッグを支援するための様々なツールがあります。

例えば、’pry’や’rubocop’などのGemを利用することで、より効率的にデバッグを進めることが可能です。

●Rubyデバッグの具体的な例

この記事では、初心者でも分かるようにRubyデバッグの具体的な例を解説します。

7つの一般的な問題について、具体的なコードとそれをデバッグする方法を紹介します。

○例1:変数の値が期待通りでない

まず、変数の値が期待通りでない場合のデバッグ方法を見てみましょう。

下記のコードでは、変数aとbの合計を計算していますが、結果が期待通りにならない場合があります。

def add(a, b)
  a + b
end

puts add(1, "2")

このコードを実行すると、エラーが発生します。

なぜなら、整数と文字列は直接加算できないからです。

これをデバッグするためには、putsデバッグを使って各変数の型を確認します。

def add(a, b)
  puts "aのクラス: #{a.class}, bのクラス: #{b.class}"
  a + b
end

puts add(1, "2")

上記のコードを実行すると、”aのクラス: Integer, bのクラス: String”と出力されます。

これにより、bが文字列であることが分かり、そこが問題の原因であることが理解できます。

○例2:ループが無限に続いてしまう

次に、ループが無限に続いてしまうケースについて見てみましょう。

下記のコードでは、1から10までの数値を出力するループを作成していますが、間違えて無限ループを作成してしまったとします。

i = 1
while i < 10
  puts i
end

このコードをデバッグするには、ループの各ステップでiの値を出力して、その動きを理解します。

i = 1
while i < 10
  puts "現在のiの値: #{i}"
  puts i
end

上記のコードを実行すると、「現在のiの値: 1」が無限に出力されます。

これにより、iの値が増加していないことが分かります。

○例3:エラーメッセージが理解できない

時にはエラーメッセージ自体が理解できないことがあります。

そのような場合には、エラーメッセージを丁寧に読み解くことが重要です。

def hello
  puts "Hello, world!"
end

heloo

上記のコードは名前が間違っているため、NoMethodErrorが発生します。

エラーメッセージをよく読むと、存在しないメソッド’heloo’が呼び出されていることが分かります。

ここで’hello’と書くべきだと気付くことができます。

○例4:条件分岐が正しく動作しない

条件分岐が正しく動作しない場合も、デバッグが必要です。

下記のコードは、与えられた数値が偶数であるか奇数であるかを判定します。

def even_or_odd(n)
  if n % 2 = 0
    "偶数"
  else
    "奇数"
  end
end

puts even_or_odd(3)

上記のコードを実行すると、SyntaxErrorが発生します。

これは、「n % 2 = 0」が正しくないからです。この場合、「=」ではなく「==」を使用すべきです。

○例5:配列やハッシュの操作でエラー

配列やハッシュの操作においてもエラーは発生します。

例えば、下記のコードは、配列の各要素を2倍にしようとしています。

numbers = [1, 2, 3, 4, 5]

numbers.each do |n|
  n * 2
end

puts numbers

このコードを実行しても、元の配列がそのまま出力されます。

なぜなら、eachメソッドでは元の配列を変更しないからです。

これを解決するには、mapメソッドを使用します。

numbers = [1, 2, 3, 4, 5]

numbers = numbers.map do |n|
  n * 2
end

puts numbers

これで、各要素が2倍になった新しい配列が出力されます。

次に、ハッシュの例を見てみましょう。

下記のコードは、ハッシュの各要素にアクセスしようとしています。

person = { "name" => "Alice", "age" => 20 }

puts person.name

しかし、このコードを実行するとNoMethodErrorが発生します。

ハッシュの要素にアクセスするには、キーを指定する必要があります。

person = { "name" => "Alice", "age" => 20 }

puts person["name"]

これで、正しく”Alice”が出力されます。

○例6:メソッドが期待通りに動作しない

メソッドが期待通りに動作しない場合もあります。

下記のコードでは、与えられた数値の平方根を計算しようとしています。

def sqrt(n)
  n ** (1 / 2)
end

puts sqrt(4)

このコードを実行すると、「1.0」が出力されますが、期待した結果は「2」です。

これは、Rubyでは整数同士の除算結果は整数になるためです。

この問題を解決するには、少なくとも一方の数値を浮動小数点数にする必要があります。

def sqrt(n)
  n ** (1.0 / 2)
end

puts sqrt(4)

これで、「2.0」が正しく出力されます。

○例7:外部ライブラリやAPIの問題

外部ライブラリやAPIを使用する際にも、問題が発生することがあります。

その際には、公式のドキュメンテーションを参照するか、具体的なエラーメッセージで検索して解決策を探すことが重要です。

●デバッグ時の注意点と対処法

デバッグを行う際には、次の点に注意しましょう。

①エラーメッセージを読む

エラーメッセージは問題の手がかりを与えてくれます。

時間をかけて丁寧に読みましょう。

②少しずつ変更する

一度に多くのコードを変更すると、どの変更が問題を解決したのか分からなくなる可能性があります。

一度に一つの変更を行い、その影響を確認しましょう。

③バージョンを確認する

使用しているRubyやライブラリのバージョンが古いと、予期せぬ問題が発生することがあります。

必要に応じてバージョンを更新しましょう。

これらの手法を使って、コードの問題を解決しましょう。

まとめ

この記事では、Rubyのデバッグについて、具体的な例を通じて解説しました。

これらの基本的なテクニックを身につけることで、Rubyプログラミングにおける問題解決の能力が向上します。

デバッグはコードを書く上で避けて通れない作業です。

様々な問題に対する理解を深め、効率的なデバッグ方法を学んでいきましょう。