💡 この記事でわかること
- メソッド(関数)とは何か、なぜ使うのか
defを使ったメソッドの定義と呼び出し方- 引数で値を渡す方法と、
returnを書かなくても戻り値が決まる仕組み - デフォルト引数・キーワード引数の使い方
- メソッドの中と外で変数が共有されない、というスコープの考え方
1. メソッド(関数)とは?
メソッドとは、
👉 いくつかの処理をひとまとめにして、名前をつけたものです。他の言語で「関数」と呼ばれるものにあたります。
💡 同じような処理を何度も書く代わりに、メソッドとして1回定義しておけば、名前を書くだけで何度でも呼び出せます。コードの重複が減り、修正も1か所で済むようになります。
これまで使ってきた puts や gets、配列の push・each なども、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 # 88. 変数のスコープ(メソッドの中と外)
👉 メソッドの中で作った変数は、そのメソッドの中でしか使えません。この「変数が使える範囲」をスコープといいます。
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.09. メソッド名のうしろの ? と !
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) | メソッドを作ること。def 〜 end |
| 呼び出し | 作ったメソッドを実行すること(名前を書くだけ) |
| 引数(ひきすう) | メソッドに渡す値 |
| 戻り値 | メソッドが返す結果。最後に評価した式が自動で戻り値になる |
| return | 途中でメソッドを抜けるときに使う |
| デフォルト引数 | 省略されたときに使われる初期値 |
| キーワード引数 | 引数名: で定義し、引数名: 値 で渡す |
| スコープ | 変数が使える範囲。メソッドの中と外で共有されない |
11. まとめ
- def メソッド名 〜 end で定義し、名前を書くだけで呼び出す
- 引数で値を渡す。個数が合わないと
ArgumentError - 戻り値は最後に評価した式。
returnは途中で抜けたいときだけ使う - デフォルト引数で省略可能に、キーワード引数で分かりやすく渡せる
- 複数の値はカンマ区切りで返し、
a, b = ...で受け取れる - メソッドの中と外で変数は共有されない(スコープ)。やりとりは引数と戻り値で
👉 「同じコードを2回書きそうになったらメソッドにする」と意識するだけで、プログラムがぐっと整理されます。まずは引数1つ・戻り値1つの小さなメソッドから作ってみましょう。