Rubyのメソッドとは?defの書き方・引数・戻り値を解説

PR Ruby

Rubyのメソッドとは?defの書き方・引数・戻り値を解説

💡 この記事でわかること

  • メソッド(関数)とは何か、なぜ使うのか
  • def を使ったメソッドの定義と呼び出し方
  • 引数で値を渡す方法と、return を書かなくても戻り値が決まる仕組み
  • デフォルト引数・キーワード引数の使い方
  • メソッドの中と外で変数が共有されない、というスコープの考え方

1. メソッド(関数)とは?

メソッドとは、
👉 いくつかの処理をひとまとめにして、名前をつけたものです。他の言語で「関数」と呼ばれるものにあたります。

💡 同じような処理を何度も書く代わりに、メソッドとして1回定義しておけば、名前を書くだけで何度でも呼び出せます。コードの重複が減り、修正も1か所で済むようになります。

これまで使ってきた putsgets、配列の pusheach なども、Rubyにあらかじめ用意されたメソッドです。この記事では、それを自分で作る方法を見ていきます。

👉 Rubyの基本文法(puts・変数・式展開)についての記事はこちら


2. メソッドの定義と呼び出し(def)

メソッドを作ることを「定義する」といい、def を使います。作ったメソッドは、名前を書くだけで「呼び出す」と実行されます。

def hello
  puts "こんにちは"
  puts "Rubyのメソッドです"
end

hello   # ← 呼び出し。ここで中の処理が実行される
  • def メソッド名end で定義する
  • 定義しただけでは実行されない。hello呼び出して初めて動く
  • 引数がないときは、呼び出しに () を付けても付けなくてもよい(hello() でも動く)

💡 メソッド名は変数と同じくスネークケース(calc_total のようにアンダースコア区切り)で書くのがRubyの慣習です。


3. 引数 — メソッドに値を渡す

メソッド名のうしろの ( ) の中に変数名を書くと、呼び出すときに値を渡せます。この受け渡しする値を引数(ひきすう)といいます。

def greet(name)
  puts "こんにちは、#{name}さん"
end

greet("太郎")   # こんにちは、太郎さん
greet("花子")   # こんにちは、花子さん

引数は複数渡すこともできます。その場合はカンマで区切り、書いた順番どおりに対応します。

def introduce(name, age)
  puts "#{name}さんは#{age}歳です"
end

introduce("太郎", 20)   # 太郎さんは20歳です

👉 渡す個数が足りなかったり多すぎたりすると ArgumentError になります。定義側で受け取る変数を「仮引数」、呼び出し側で実際に渡す値を「実引数」と呼びます。


4. 戻り値 — 最後の式が自動で返る

メソッドの処理結果を呼び出し元に返す値を戻り値といいます。

👉 Rubyでは、return を書かなくても「メソッドの中で最後に評価した式」が自動的に戻り値になります。これはPHPやPythonと大きく違うRubyの特徴です。

def add(a, b)
  a + b   # return を書かなくても、この結果が戻り値になる
end

result = add(3, 5)
puts result       # 8
puts add(10, 20)  # 30(戻り値を直接使うこともできる)

return は、処理の途中でメソッドを抜けたいときに使います。return が実行されると、そこでメソッドは終了し、あとの処理は実行されません。

def judge(score)
  return "不合格" if score < 60   # 60未満ならここで終了
  "合格"                          # それ以外は最後の式が戻り値
end

puts judge(75)   # 合格
puts judge(40)   # 不合格

💡 puts は画面に表示するだけで、値を返すわけではありません(puts 自体の戻り値は nil です)。「表示する」と「返す」は別物なので、メソッドの戻り値を使いたいときは puts ではなく式の結果をそのまま置きます。

👉 Rubyのif文・for文・while文(後置ifなど)についての記事はこちら


5. デフォルト引数(省略できる引数)

引数に = で初期値を設定しておくと、呼び出すときにその引数を省略できます。省略された場合は初期値が使われます。

def greet(name, greeting = "こんにちは")
  puts "#{greeting}、#{name}さん"
end

greet("太郎")              # こんにちは、太郎さん(greeting は初期値)
greet("花子", "おはよう")   # おはよう、花子さん

👉 デフォルト引数は、通常の引数よりあとに書きます


6. キーワード引数(名前で渡す)

引数名のうしろに : を付けて定義すると、呼び出すときに 引数名: 値 の形で渡すようになります。これをキーワード引数といいます。

def profile(name:, age:, city: "未設定")
  puts "#{name} / #{age}歳 / #{city}"
end

profile(name: "太郎", age: 20, city: "東京")
profile(age: 25, name: "花子")   # 順番が違ってもよい / city は初期値

💡 引数が多いメソッドでは、キーワード引数にするとコードが読みやすくなります。どの値が何を表すのか、呼び出し側を見ただけで分かるためです。age: のように初期値を書かなければ「必ず渡す引数」、city: "未設定" のように書けば「省略できる引数」になります。


7. 複数の値を返す

👉 Rubyでは、カンマで区切って複数の値を返すと、自動的に配列にまとめられます。受け取る側もカンマで区切って書けば、それぞれの変数に分けて取り出せます(多重代入)。

def min_max(numbers)
  return numbers.min, numbers.max
end

low, high = min_max([3, 1, 8, 5])
puts low    # 1
puts high   # 8

👉 Rubyの配列・ハッシュについての記事はこちら


8. 変数のスコープ(メソッドの中と外)

👉 メソッドの中で作った変数は、そのメソッドの中でしか使えません。この「変数が使える範囲」をスコープといいます。

def calc
  total = 100   # calc の中だけで有効
  puts total
end

calc         # 100
puts total   # エラー! メソッドの外からは total を使えない

💡 逆に、メソッドの外で定義した変数も、メソッドの中からは見えません(Pythonとは異なり、PHPと同じ考え方です)。次のコードはエラーになります。

tax = 1.1

def price(base)
  base * tax   # エラー: tax はここでは見えない
end

👉 メソッドに外の値を使わせたいときは「引数で渡す」「戻り値で返す」のが基本です。そうすることで、メソッドが何を受け取り何を返すのかが呼び出し側から分かり、バグを減らせます。

def price(base, tax)
  base * tax
end

puts price(1000, 1.1)   # 1100.0

9. メソッド名のうしろの ? と !

Rubyのメソッド名は、最後に ?! を付けられます。文法上の意味はなく、「そのメソッドがどんなものか」を名前で伝えるための慣習です。

  • ? で終わる:true / false を返すメソッド(empty?include?even? など)
  • ! で終わる:呼び出すと元のデータそのものを書き換えるなど、注意が必要なメソッド(sort!upcase! など)
nums = [3, 1, 2]

p nums.sort    # [1, 2, 3](並べ替えた新しい配列を返す)
p nums         # [3, 1, 2](元はそのまま)

nums.sort!     # 元の nums 自体を並べ替える
p nums         # [1, 2, 3]

💡 自分でメソッドを作るときも、真偽を返すものには ? を付けると読みやすくなります(例:def adult?(age))。


10. メソッドまわりの用語まとめ

用語意味
定義(def)メソッドを作ること。defend
呼び出し作ったメソッドを実行すること(名前を書くだけ)
引数(ひきすう)メソッドに渡す値
戻り値メソッドが返す結果。最後に評価した式が自動で戻り値になる
return途中でメソッドを抜けるときに使う
デフォルト引数省略されたときに使われる初期値
キーワード引数引数名: で定義し、引数名: 値 で渡す
スコープ変数が使える範囲。メソッドの中と外で共有されない

11. まとめ

  • def メソッド名 〜 end で定義し、名前を書くだけで呼び出す
  • 引数で値を渡す。個数が合わないと ArgumentError
  • 戻り値は最後に評価した式return は途中で抜けたいときだけ使う
  • デフォルト引数で省略可能に、キーワード引数で分かりやすく渡せる
  • 複数の値はカンマ区切りで返し、a, b = ... で受け取れる
  • メソッドの中と外で変数は共有されない(スコープ)。やりとりは引数と戻り値で

👉 「同じコードを2回書きそうになったらメソッドにする」と意識するだけで、プログラムがぐっと整理されます。まずは引数1つ・戻り値1つの小さなメソッドから作ってみましょう。

-Ruby
-, , , ,