Rubyでプログラミングを行う際、処理を共通化して再利用性を高めるために欠かせないのがメソッドの定義です。

Rubyのメソッドは非常に柔軟な設計が可能であり、引数の持たせ方やブロックの活用によって、コードの可読性とメンテナンス性を劇的に向上させることができます。

本記事では、Rubyにおけるメソッド定義の基本から、実務で役立つ応用的な引数の指定、さらにRubyらしい強力な機能であるブロックの渡し方までを詳しく解説します。

基本的なメソッドの定義方法

Rubyでメソッドを定義するには、def キーワードを使用します。

もっともシンプルな形は、メソッド名と処理の内容を記述し、end で閉じる構成です。

Ruby
# 引数を持たないシンプルなメソッド定義
def greet
  puts "こんにちは、Rubyの世界へ!"
end

# メソッドの呼び出し
greet
実行結果
こんにちは、Rubyの世界へ!

メソッド名には、小文字のアルファベット、数字、アンダースコアを使用するのが一般的です。

Rubyでは慣習として、スネークケース (snake_case) を用いてメソッド名を命名することが推奨されています。

引数の高度な指定方法

メソッドに外部からデータを渡すための仕組みが引数です。

Rubyでは、通常の引数に加えて、デフォルト値の設定やキーワード引数など、多様な指定方法が用意されています。

デフォルト値付き引数

引数が渡されなかった場合に、あらかじめ設定した値を使用するのがデフォルト値付き引数です。

これにより、メソッド呼び出し時の記述を省略しつつ、必要に応じて値を変更できる柔軟性を持たせることができます。

Ruby
def display_message(message = "標準のメッセージ")
  puts message
end

display_message()             # デフォルト値が使われる
display_message("カスタム入力") # 指定した値が使われる
実行結果
標準のメッセージ
カスタム入力

キーワード引数による可読性向上

引数の数が増えると、どの値が何を意味しているのかが分かりにくくなることがあります。

このような場合には、キーワード引数を利用することで、呼び出し側で引数名を明示できるようになります。

Ruby
def create_user(name:, age:, role: "一般")
  puts "名前: #{name}, 年齢: #{age}, 権限: #{role}"
end

# 呼び出し時にラベルを指定する
create_user(name: "田中", age: 25)
実行結果
名前: 田中, 年齢: 25, 権限: 一般

キーワード引数を使用することで、引数の順番を覚える必要がなくなり、コードの意図が明確になります。

可変長引数 (* と **)

渡される引数の数が決まっていない場合には、可変長引数を使用します。

*args は複数の引数を配列として受け取り、**kwargs はキーワード引数をハッシュとして受け取ります。

Ruby
def list_items(*items)
  items.each { |item| puts "商品: #{item}" }
end

list_items("リンゴ", "バナナ", "オレンジ")
実行結果
商品: リンゴ
商品: バナナ
商品: オレンジ

戻り値の扱い

Rubyのメソッドは、最後に評価された式の値が自動的に戻り値となります。

明示的に return を記述することも可能ですが、Rubyらしいコードでは省略されることが多いです。

Ruby
def add(a, b)
  a + b # この計算結果が戻り値になる
end

result = add(10, 20)
puts result
実行結果
30

条件によって早期にメソッドを終了させたい場合には、return を使用して処理を抜けるのが一般的です。

ブロックの渡し方と活用

Rubyの大きな特徴の一つに、メソッドに「処理の塊 (ブロック)」を渡せる点があります。

これにより、メソッド内部の一部処理を外部から動的に注入することが可能になります。

yield を使った実行

もっとも一般的なブロックの実行方法は、yield キーワードを使用することです。

Ruby
def wrap_with_log
  puts "[開始] 処理を実行します"
  yield if block_given? # ブロックがあれば実行する
  puts "[終了] 処理が完了しました"
end

wrap_with_log do
  puts "メインの処理を実行中です"
end
実行結果
[開始] 処理を実行します
メインの処理を実行中です
[終了] 処理が完了しました

block_given? メソッドを併用することで、ブロックが渡されなかった際のエラーを防ぐことができます。

&block による手続きオブジェクト化

ブロックを他のメソッドに引き渡したり、変数として扱いたい場合は、引数に &block を指定します。

これにより、渡されたブロックが Proc オブジェクトとして扱えるようになります。

Ruby
def execute_later(&block)
  puts "Procオブジェクトとして受け取ります"
  block.call # callメソッドで実行
end

execute_later { puts "ブロック内の処理です" }
実行結果
Procオブジェクトとして受け取ります
ブロック内の処理です

2026年時点でのモダンな書き方

Rubyは進化を続けており、近年ではより簡潔なメソッド定義も好まれます。

特に1行で完結する処理については、end を省略したエンドレスメソッド定義が普及しています。

Ruby
# エンドレスメソッド定義 (Ruby 3.0以降)
def square(x) = x * x

puts square(5)
実行結果
25

計算式だけのメソッドや、単純な属性へのアクセスを行うメソッドなどで、非常にスマートな記述が可能です。

ただし、複雑なロジックを含む場合は、通常の def ... end 形式を使用し、可読性を優先することが大切です。

まとめ

Rubyのメソッド定義は、シンプルながらも非常に奥が深く、表現力豊かなプログラムを可能にします。

まずは基本的な def の書き方をマスターし、次にデフォルト値やキーワード引数を使いこなせるようになりましょう。

さらに、ブロックと yield を活用することで、Ruby特有の柔軟な設計ができるようになります。

可読性の高いメソッドを定義することは、自分だけでなくチーム全体の開発効率を高めることに直結します。

今回学んだ知識を活かして、美しくメンテナンスしやすいRubyコードを目指してください。