【Ruby】レッスン3-01:メソッドの定義と呼出しを学ぼう

一つ前のチャプターではRubyの制御構造について学習しました。
今回からは 関数とスコープ について見ていきましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:メソッド編
・Lesson3-1:メソッドの基本を理解しよう ◁今回はココ
・Lesson3-2:デフォルト引数とキーワード引数を理解しよう
・Lesson3-3:メソッドの戻り値を理解しよう
・Lesson3-4:真偽値を返すメソッドを理解しよう
・Lesson3-5:エラーメッセージを読めるようになろう
・Lesson3-6:例外処理を理解しよう
・確認問題3-☆1:石取りゲームを作ろう
・確認問題3-☆2:丁半賭博ゲームを作ろう
Lesson4:コレクション編
Lesson5:オブジェクト指向編
Rubyのメソッドの概要と使い方

Rubyにおいて、メソッドは特定の処理を一つにまとめて再利用できるようにしたコードのブロックです。
メソッドを使うことで同じ処理を何度も書く手間を省き、保守しやすいコードを作ることができます。
本記事ではRubyでのメソッドの定義と呼出しについて、基本的な構文と使い方を学びます。
メソッドとは何かを理解しよう
メソッドとはコードの再利用性を高め、同じ処理を何度でも呼び出せる仕組みです。
例えば同じ計算処理を繰り返し使いたい場合にメソッドとして定義しておけば、他の部分でも簡単にその処理を呼び出すことができます。
Rubyではdef
キーワードを使ってメソッドを定義します。
メソッドを定義する基本構文
メソッドを定義するための基本構文は以下の通りです。
def メソッド名(引数1, 引数2, ...) # 実行したい処理 end
def
キーワードの後にメソッド名を指定します。メソッド名は小文字で始めるのが一般的です。- 必要な引数がある場合は括弧内にカンマで区切って記述します。
- 最後に
end
でメソッドの定義を終了します。
例えば2つの引数を加算するadd
メソッドを定義してみましょう。
def add(a, b) # aとbの二つの引数を持つaddという名のメソッドを定義 puts a + b # このメソッドの処理内容 end
このadd
メソッドは、このあと説明する引数を受け取って、その合計値を出力します。
このようにして定義したメソッドは後から自由に呼び出して使用できます。
メソッドを実際に呼び出して使う
定義したメソッドを実際に使うには、メソッド名と必要な引数を指定して呼び出します。
例えば先ほどのadd
メソッドを呼び出すには次のようにします。
add(10, 20) # addメソッドの呼び出し。30と出力される。
ここでadd(10, 20)
とすることで、引数10と20がa
とb
に渡され、合計値の30が出力されます。
また、引数が不要なメソッドも定義できます。
例えば固定メッセージを表示するgreet
メソッドを作成してみましょう。
def greet # 引数の無いgreetメソッドを定義 puts "Hello, Ruby!" # greetメソッドの処理内容 end greet # grretメソッドの呼び出し。Hello, Ruby!と出力。
このように引数を指定せずにメソッドを呼び出すことも可能です。
より実践的なメソッドの使用例
もう少し複雑な例として、割り算を行い、割り切れるかどうかを判定するメソッドを作成してみましょう。
このメソッドは引数を2つ受け取り、割り切れる場合は「割り切れる」、そうでない場合は「割り切れない」と出力します。
def divisible?(a, b) # divisible?の定義 if b == 0 # 早期リターン(例外を早めに除外) puts "0では割り算できません" end if a % b == 0 puts "割り切れる" else puts "割り切れない" end end divisible?(10, 2) #=> 割り切れる divisible?(10, 3) #=> 割り切れない divisible?(10, 0) #=> 0では割り算できません
この例では引数a
をb
で割った際に余りが0であれば「割り切れる」、そうでなければ「割り切れない」と表示します。
さらに0で割ることはできないため、b
が0の場合はエラーメッセージを返します。
このコードをメソッドを使わずに書こうとすると、同じコードを何度も繰り返す非常に冗長なコードになることがお判りでしょうか。
メソッドを利用することでコードが短くなり、ミスを減らすことにも繋がります。
まとめ

この図はこれからこの「第3章 メソッドと例外処理編」で学習する内容を視覚的に分かりやすくまとめた概念図です。本記事の内容は一番上のメソッドAに該当します。
メソッドはコードをまとめて再利用するための強力な手段です。
Rubyではdef
キーワードを使ってメソッドを定義し、メソッド名と引数を指定して呼び出します。
メソッドを活用することで同じ処理を何度も書かずに済み、コードの見通しが良くなります。
次回はメソッドのさらに便利な使い方であるデフォルト引数やキーワード引数について学びましょう。
練習問題:メソッドを使って電卓を作ろう

メソッド定義と呼出しをしっかりと身に着けるため、練習問題に挑戦しましょう。
メソッド定義と呼出しの基本問題に挑戦
簡単な電卓を作成しましょう。
このプログラムでは、加算、減算、乗算、除算の4つの基本的な算術演算を行います。
ユーザーが入力した2つの数値を使用して、それぞれの計算を実行し、結果を画面に表示します。
また計算を続けるかどうかをユーザーに尋ねる機能も実装します。
以下の要件に従ってコードを完成させてください。
add(a, b)
メソッドを定義し、2つの引数を加算して結果を表示すること。subtract(a, b)
メソッドを定義し、2つの引数を減算して結果を表示すること。multiply(a, b)
メソッドを定義し、2つの引数を乗算して結果を表示すること。divide(a, b)
メソッドを定義し、2つの引数を除算して結果を表示すること。ただし、0で割る場合はエラーメッセージを表示すること。- ユーザーから2つの数値を入力させ、その数値を使って加算、減算、乗算、除算のいずれかを選択して計算を行うこと。
- 計算を続けるかどうかをユーザーに尋ね、
yes
と答えた場合は再度計算を行い、no
と答えた場合はプログラムを終了すること。
ただし、以下のような実行結果となること。
1つ目の数値を入力してください: 10 2つ目の数値を入力してください: 5 加算は1、減算は2、乗算は3、除算は4を入力してください: 1 結果: 15.0 計算を続けますか? (yes/no) no プログラムを終了します。
【ヒント】自力で解くのが難しい人へ
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
1:メソッドaddの定義
□ 加算結果を出力
2:メソッドsubtractの定義
□ 減算結果を出力
3:メソッドmultiplyの定義
□ 乗算結果を出力
4:メソッドdivideの定義
□ if文にて引数bが0であるかを判定
□ □ 真の場合、「エラー: 0で割ることはできません」と出力
□ □ 偽の場合、除算結果を出力
5:メソッドcontinue?の定義
□ 「計算を続けますか? (yes/no)」と出力
□ ユーザーの入力を受け取り、小文字に変換して変数answerに代入
□ 変数answerが”yes”と等しいかを判定し、結果を返す
6:変数continue_calculationにtrueを代入
7:while文にてcontinue_calculationがtrueである間、以下の処理を繰り返す
□ 「1つ目の数値を入力してください:」と出力
□ ユーザーからの入力をfloat型に変換して変数num1に代入
□ 「2つ目の数値を入力してください:」と出力
□ ユーザーからの入力をfloat型に変換して変数num2に代入
□ 「加算は1、減算は2、乗算は3、除算は4を入力してください:」と出力
□ ユーザーの入力を整数型に変換して変数operationに代入
□ case文にて変数operationの値に応じた処理を実行
□ □ when 1: メソッドaddを呼び出し、num1とnum2の加算結果を表示
□ □ when 2: メソッドsubtractを呼び出し、num1とnum2の減算結果を表示
□ □ when 3: メソッドmultiplyを呼び出し、num1とnum2の乗算結果を表示
□ □ when 4: メソッドdivideを呼び出し、num1とnum2の除算結果を表示
□ □ else: 「無効な操作です」と出力
□ メソッドcontinue?の戻り値を変数continue_calculationに代入
8:「プログラムを終了します。」と出力
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# 加算を行うメソッド =begin 【穴埋め問題1】 ここでaddメソッドを定義し、引数aとbの加算結果を出力するコードを書いてください。 =end # 減算を行うメソッド =begin 【穴埋め問題2】 ここでsubtractメソッドを定義し、引数aとbの減算結果を出力するコードを書いてください。 =end # 乗算を行うメソッド =begin 【穴埋め問題3】 ここでmultiplyメソッドを定義し、引数aとbの乗算結果を出力するコードを書いてください。 =end # 除算を行うメソッド =begin 【穴埋め問題4】 ここでdivideメソッドを定義し、引数bが0でない場合のみ除算を行い、その結果を出力するコードを書いてください。 =end # ユーザーが計算を続けたいかどうかを尋ねるメソッド =begin 【穴埋め問題5】 ここでcontinue?メソッドを定義し、「計算を続けますか?」と尋ね、ユーザーの入力を受け取って結果を返すコードを書いてください。 =end # メインのプログラム continue_calculation = true while continue_calculation # ユーザーから2つの数値を入力として受け取る puts "1つ目の数値を入力してください:" num1 = gets.to_f puts "2つ目の数値を入力してください:" num2 = gets.to_f # ユーザーに操作を選択させる puts "加算は1、減算は2、乗算は3、除算は4を入力してください:" operation = gets.to_i # 選択された操作を実行 case operation when 1 =begin 【穴埋め問題6】 ここでaddメソッドを呼び出し、num1とnum2の加算結果を表示するコードを書いてください。 =end when 2 =begin 【穴埋め問題7】 ここでsubtractメソッドを呼び出し、num1とnum2の減算結果を表示するコードを書いてください。 =end when 3 =begin 【穴埋め問題8】 ここでmultiplyメソッドを呼び出し、num1とnum2の乗算結果を表示するコードを書いてください。 =end when 4 =begin 【穴埋め問題9】 ここでdivideメソッドを呼び出し、num1とnum2の除算結果を表示するコードを書いてください。 =end else puts "無効な操作です" end # ユーザーが計算を続けたいかどうかを確認する continue_calculation = continue? end puts "プログラムを終了します。"
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
この問題の解答例と解説
この問題の正解コードとその解説は以下の通りです。
クリックして開いて確認してください。
- 正解コード
-
# 加算を行うメソッド def add(a, b) puts "結果: #{a + b}" end # 減算を行うメソッド def subtract(a, b) puts "結果: #{a - b}" end # 乗算を行うメソッド def multiply(a, b) puts "結果: #{a * b}" end # 除算を行うメソッド def divide(a, b) # 0で割ることを防ぐためのチェック if b == 0 puts "エラー: 0で割ることはできません" else puts "結果: #{a / b}" end end # ユーザーが計算を続けたいかどうかを尋ねるメソッド def continue? puts "計算を続けますか? (yes/no)" answer = gets.chomp.downcase answer == "yes" end # メインのプログラム continue_calculation = true while continue_calculation # ユーザーから2つの数値を入力として受け取る puts "1つ目の数値を入力してください:" num1 = gets.to_f puts "2つ目の数値を入力してください:" num2 = gets.to_f # ユーザーに操作を選択させる puts "加算は1、減算は2、乗算は3、除算は4を入力してください:" operation = gets.to_i # 選択された操作を実行 case operation when 1 add(num1, num2) when 2 subtract(num1, num2) when 3 multiply(num1, num2) when 4 divide(num1, num2) else puts "無効な操作です" end # ユーザーが計算を続けたいかどうかを確認する continue_calculation = continue? end puts "プログラムを終了します。"
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
メソッドの定義
def add(a, b) puts "結果: #{a + b}" end
ここでは
add
というメソッドを定義しています。def
キーワードでメソッドを定義し、add
がメソッド名です。(a, b)
は引数リストで、このメソッドは2つの数値を受け取ります。puts
でa + b
の結果を画面に表示します。他の
subtract
(減算)、multiply
(乗算)、divide
(除算)メソッドも同様に定義されています。条件分岐と例外処理(除算)
def divide(a, b) if b == 0 puts "エラー: 0で割ることはできません" else puts "結果: #{a / b}" end end
divide
メソッドではb
が0でないかを確認するためにif
文を使っています。0で割るとエラーが発生するため、このようにエラーメッセージを表示して対処しています。else
の部分で通常の除算を行い、その結果を表示します。初心者にとって、除算では0で割るケースに対応する方法を学ぶのは重要です。
メソッドの呼び出し
add(num1, num2) subtract(num1, num2) multiply(num1, num2) divide(num1, num2)
上記のコードで定義したメソッドをここで呼び出しています。
例えば
add(num1, num2)
は、変数num1
とnum2
を引数としてadd
メソッドに渡し、その結果を表示します。これによりメソッドがどのように使われるかが理解できます。
ユーザーからの入力とループ
puts "1つ目の数値を入力してください:" num1 = gets.to_f puts "2つ目の数値を入力してください:" num2 = gets.to_f
この部分では、
gets
を使ってユーザーからの入力を受け取り、その入力をto_f
メソッドで浮動小数点数に変換しています。数値を扱う際にはこのように適切なデータ型に変換することが大事です。
ユーザーが計算を続けるかどうかを確認する
def continue? puts "計算を続けますか? (yes/no)" answer = gets.chomp.downcase answer == "yes" end
この
continue?
メソッドはユーザーが計算を続けるかどうかを尋ねます。gets
でユーザーの入力を受け取り、chomp
で余分な改行を削除し、downcase
で入力を小文字に変換します。"yes"
であればtrue
を返し、プログラムは再び計算を続けます。繰り返し処理(ループ)
while continue_calculation # 計算処理 continue_calculation = continue? end
while
ループを使ってユーザーが「yes」と答えた限り計算を続けます。この部分ではループの仕組みとユーザーインタラクションを学ぶことができます。
まとめ
このプログラムでは基本的なメソッドの定義と呼び出し、条件分岐、ユーザー入力の扱い方、ループ処理を学びました。
特にメソッドを定義して再利用することで、同じ処理を繰り返し実行する際に効率的にコードを書く方法を理解できます。
FAQ|Rubyのメソッド定義と呼び出しの基本
- Q1. Rubyのメソッド名に「?」や「!」を付ける意味は何ですか?
-
Rubyではメソッド名の末尾に「?」を付けると、そのメソッドが真偽値(trueまたはfalse)を返すことを意味します。また「!」を付けたメソッドは元のオブジェクトを破壊的に変更することを示すのが一般的です。ただし、これらはRubyの慣習であり、必須ではありません。
- Q2. 引数がないメソッドを定義する場合、括弧を省略しても大丈夫ですか?
-
はい、Rubyでは引数のないメソッドを定義する際に括弧を省略することができます。ただし、明示的に括弧を書くことで可読性が向上し、特に初心者や他人と協働する場面では括弧を使うことが推奨されます。
- Q3. メソッドを定義する場所に決まりはありますか?
-
基本的にはスクリプトのどこにでもメソッドを定義できますが、処理の見通しを良くするために、通常はスクリプトの上部や適切なクラス・モジュール内に定義します。定義より前に呼び出すとエラーになるため、記述順にも注意が必要です。