カテゴリ: Ruby 更新日: 2026/04/12

Rubyの引数受け渡しを完全攻略!引数展開とパラメータフォワーディングの仕組み

引数の受け渡し完全攻略:引数展開・パラメータフォワーディング(...)
引数の受け渡し完全攻略:引数展開・パラメータフォワーディング(...)

先生と生徒の会話形式で理解しよう

生徒

「Rubyでメソッドを作るとき、別のメソッドにそのまま引数を渡したい場合はどうすればいいですか?」

先生

「それには、パラメータフォワーディングという便利な書き方がありますよ。記号を三つ並べて『...』と書く方法です。」

生徒

「点々が三つですか?なんだか不思議な書き方ですね。引数展開という言葉も聞いたことがありますが、それとは違うのでしょうか?」

先生

「良い視点ですね!引数展開は、まとまったデータをバラバラにして渡す技術です。今回はその両方の使い方を詳しく見ていきましょう!」

1. 引数とメソッドの基本をおさらい

1. 引数とメソッドの基本をおさらい
1. 引数とメソッドの基本をおさらい

Rubyにおける引数(ひきすう)とは、メソッドという「処理の箱」に対して、外から投げ入れるデータのことです。例えば、料理のレシピをメソッドとすると、材料が引数にあたります。メソッドは受け取った引数を使って計算したり、画面に文字を出したりします。そして、処理が終わった後に返ってくる結果を戻り値(もどりち)と呼びます。プログラミング未経験の方は、まず「何かを渡して、中で加工して、結果をもらう」という流れをイメージしてください。この引数の渡し方には、順番通りに渡す方法や名前を付けて渡す方法など、いくつかの種類があります。今回は、それらをより効率的に、そしてスマートに扱うための高度なテクニックを学んでいきます。

Rubyの文法を基礎からしっかり固めたい人や、 現場で役立つ「テスト駆動開発」の考え方まで身につけたい人には、 評価の高いこの一冊がおすすめです。

プロを目指す人のためのRuby入門をAmazonで見る

※ Amazon広告リンク

2. 配列をバラバラにする引数展開の魔法

2. 配列をバラバラにする引数展開の魔法
2. 配列をバラバラにする引数展開の魔法

複数のデータが一つにまとまった「配列」を、メソッドに渡すときにバラバラにして個別の引数として扱いたいことがあります。これを引数展開と呼びます。使い方はとても簡単で、配列の変数の前にアスタリスク記号「*」を一つ付けるだけです。これを「スプラット演算子」と呼ぶこともあります。例えば、三つの数字が入った配列を、三つの引数を取るメソッドに渡す場合、アスタリスクを使えば自動的に一つずつ割り当ててくれます。手作業で「配列の〇番目」と指定して渡す必要がないため、コードが非常にスッキリしますし、書き間違いも減らすことができます。


def calculate_sum(a, b, c)
  puts a + b + c
end

numbers = [10, 20, 30]

# 配列をそのまま渡すとエラーになりますが、* を付けると展開されます
calculate_sum(*numbers)

60

3. キーワード引数を展開する方法

3. キーワード引数を展開する方法
3. キーワード引数を展開する方法

引数には、名前を付けて渡す「キーワード引数」というものもあります。これを展開したいときは、アスタリスクを二つ重ねて「**」と書きます。これは、データが名前と値のペア(ハッシュ)になっている場合に役立ちます。例えば、設定情報が入ったハッシュをメソッドに渡すとき、二重アスタリスクを使えば、それぞれのキーがキーワード引数の名前に、値がその中身に対応して流し込まれます。Ruby 3からは、通常の引数とキーワード引数の区別が厳格になったため、この二重アスタリスクを使った展開は非常に重要な技術となっています。これを知っているだけで、複雑な設定を扱うプログラムも簡単に書けるようになります。


def print_profile(name:, age:)
  puts "名前は#{name}、年齢は#{age}歳です。"
end

user_data = { name: "佐藤", age: 20 }

# ハッシュをキーワード引数として展開して渡す
print_profile(**user_data)

名前は佐藤、年齢は20歳です。

4. パラメータフォワーディング「...」の登場

4. パラメータフォワーディング「...」の登場
4. パラメータフォワーディング「...」の登場

Ruby 2.7で導入され、Ruby 3でさらに強力になったのがパラメータフォワーディングです。これは「...」という記号を使って、受け取った引数をそのまま別のメソッドへ「丸投げ」する機能です。プログラミングをしていると、あるメソッドの中で別のメソッドを呼び出し、引数をそのまま受け流したい場面がよくあります。以前は、普通の引数、キーワード引数、ブロック(後述)をそれぞれ個別に書く必要があり、非常に面倒でした。しかし「...」を使えば、これらすべてを一括で、漏れなく次のメソッドに届けることができます。まるで、届いた荷物を開封せずにそのまま転送する配送センターのような役割を果たします。


def original_method(a, b, name:)
  puts "a: #{a}, b: #{b}, name: #{name}"
end

# 受け取った引数をすべて転送する
def wrapper_method(...)
  original_method(...)
end

wrapper_method(1, 2, name: "田中")

a: 1, b: 2, name: 田中

5. 一部の引数を取り出しつつ転送する方法

5. 一部の引数を取り出しつつ転送する方法
5. 一部の引数を取り出しつつ転送する方法

Ruby 3.1からは、このパラメータフォワーディングがさらに進化しました。すべての引数を転送するだけでなく、「最初の引数だけは自分で使い、残りの引数はすべて転送する」といった書き方ができるようになったのです。例えば、ログを記録するメソッドを作るときに、最初の引数で「操作の種類」を受け取り、残りのデータは実際の処理メソッドにそのまま渡す、といった使い方が可能です。これにより、共通の処理を挟み込みつつ、引数の受け渡しを簡潔に保つことができます。この機能を使わない場合、引数の数が増えるたびに複数の箇所を修正しなければなりませんが、フォワーディングを使えば修正箇所を一箇所に絞れるため、保守性が非常に高まります。


def process_data(target, options: {})
  puts "#{target}を処理します。オプションは#{options}です。"
end

# 最初の引数を受け取り、残りをフォワーディングする
def logger(action_name, ...)
  puts "ログ記録: #{action_name}を開始します。"
  process_data(...)
end

logger("データ保存", "顧客名簿", options: { fast: true })

ログ記録: データ保存を開始します。
顧客名簿を処理します。オプションは{:fast=>true}です。

6. ブロックの受け渡しと転送

6. ブロックの受け渡しと転送
6. ブロックの受け渡しと転送

Rubyにはブロックという、メソッドに処理の塊(プログラムの一部)を渡す仕組みがあります。これも引数の一種と考えることができます。パラメータフォワーディング「...」を使えば、このブロックも自動的に次のメソッドへ引き継がれます。もし「...」を使わずに個別に扱いたい場合は、引数の最後にアンパサンド記号「&」を付けた変数名を用意します。しかし、単に次のメソッドに渡すだけであれば、フォワーディング記号を使うのが最も安全で確実です。ブロックの扱いは初心者にとって少し難しい概念ですが、「処理の手順そのものを引数として渡せる」という点と、「それは点々三つで転送できる」という点だけ覚えておけば、Rubyらしい柔軟なコードが書けるようになります。

7. 可変長引数との使い分け

7. 可変長引数との使い分け
7. 可変長引数との使い分け

可変長引数は、アスタリスクを使って「任意の数の引数」を受け取る仕組みです。これとパラメータフォワーディングは似ていますが、目的が異なります。可変長引数は「中身を自分で加工したいとき」に使い、パラメータフォワーディングは「中身に関わらず、とにかく次のメソッドへ繋げたいとき」に使います。未経験の方は、まず「転送するならドット三つ」と覚えておけば間違いありません。また、引数展開のアスタリスク「*」や「**」は、メソッドを呼び出す側で「まとまったものをバラす」ために使うという違いも意識しましょう。これらを使い分けられるようになると、Rubyのコード読み書きが格段にスムーズになります。

8. 安全なコードを書くための注意点

8. 安全なコードを書くための注意点
8. 安全なコードを書くための注意点

引数の受け渡しは強力な機能ですが、乱用するとプログラムの流れが追いづらくなることもあります。特に「...」によるフォワーディングは、どのメソッドにどんなデータが飛んでいくのかが隠れてしまうため、メソッド名やコメントで意図を明確にすることが推奨されます。パソコンの操作に不慣れな方がプログラミングを学ぶ際、こうした記号だらけの構文に戸惑うかもしれませんが、これらは「書く手間を減らし、ミスを防ぐための道具」です。一つ一つの記号が持つ「バラす」「まとめる」「転送する」といった役割をイメージしながら、実際にコードを書いて動かしてみることで、自然と身についていくはずです。エラーが出たときは「引数の数が合っているか」「キーワードの名前は正しいか」を、今回学んだ展開のルールに照らし合わせて確認してみましょう。

カテゴリの一覧へ
新着記事
New1
Ruby
Rubyの定数とfreezeを完全ガイド!初心者でもわかる安全なデータの守り方
New2
Ruby
Rubyの破壊的メソッドを完全ガイド!初心者でもわかるミュータブルとイミュータブルの違い
New3
Ruby
Rubyの文字列性能チューニング|freeze・<<・+の違いと効率的な文字列操作
New4
Ruby
Rubyで文字列と数値を変換する方法!to_i/to_fとInteger/Floatの使い方
人気記事
No.1
Java&Spring記事人気No1
Rails
Railsのimportmap入門|Node不要でJavaScriptを使う方法と落とし穴をやさしく解説
No.2
Java&Spring記事人気No2
Ruby
WindowsでRubyをインストールする方法!RubyInstallerとMSYS2を使った完全ガイド
No.3
Java&Spring記事人気No3
Ruby
VS Codeで快適Ruby開発!拡張機能・デバッグ・Lint/Format自動化ガイド
No.4
Java&Spring記事人気No4
データベース
PostgreSQLのCTE(WITH句)完全解説!複雑なSQLを整理して読みやすくする書き方
No.5
Java&Spring記事人気No5
Ruby
Rubyの始め方ガイド:インストールから最初のHello Worldまで(Windows/Mac/Linux)
No.6
Java&Spring記事人気No6
データベース
SQLで複数テーブルを結合する方法を徹底解説!初心者でも図解でわかるJOINと集計の基本
No.7
Java&Spring記事人気No7
Rails
Rails本番運用入門:環境設計・ステージング・本番をゼロから理解するロードマップ
No.8
Java&Spring記事人気No8
データベース
PostgreSQLのデータ型を完全解説!初心者でも失敗しないデータベース入門