#20 Rubyで学ぶ関数の応用(デフォルト引数・可変長引数)の基本
はじめに
Ruby(プログラミング言語の一つ)で関数(Rubyでは「メソッド」と呼びます)を書いていると、引数に関する悩みによく出会います。たとえば「引数を省略できるようにしたい」「引数の数が決まっていない処理を書きたい」といった場面です。そんなときに便利なのが「デフォルト引数」と「可変長引数」です。この記事では、この2つの使い方と、実務でつまずきやすいポイントを初心者向けに解説します。
デフォルト引数とは
デフォルト引数とは、呼び出し側が値を指定しなかった場合に、あらかじめ決めておいた値が自動的に使われる仕組みです。「引数の初期値」と考えるとイメージしやすいでしょう。Rubyでは以下のように書きます。
def greet(name, greeting = "こんにちは")
puts "#{greeting}, #{name}さん"
end
greet("田中") # => こんにちは, 田中さん
greet("田中", "おはよう") # => おはよう, 田中さん
greeting = "こんにちは"のように、引数名の後に=で初期値を書くだけです。呼び出し側で2つ目の引数を省略すると、自動的に「こんにちは」が使われます。呼び出す側のコードがすっきりするのが最大のメリットです。
注意点として、デフォルト引数はできるだけ「後ろ側」にまとめるのがマナーです。def greet(greeting = "こんにちは", name)のように省略可能な引数を先に置いても動作はしますが、どの引数が省略できるのか一目で分かりにくくなり、コードを読む人を混乱させてしまいます。省略できる引数はできるだけ引数リストの末尾に置く、という書き方を覚えておきましょう。
可変長引数(*args)とは
可変長引数とは、呼び出すたびに引数の個数が変わっても対応できる仕組みです。Rubyでは引数名の前に*(アスタリスク)を付けることで実現できます。これを「スプラット引数」と呼ぶこともあります。
def total(*numbers) numbers.sum end total(1, 2, 3) # => 6 total(10, 20) # => 30 total() # => 0
*numbersと書くと、渡された引数がすべて配列としてまとめてnumbersに格納されます。引数の数を気にせずに呼び出せるので、合計値の計算やログ出力のように「いくつ渡されるか分からない」処理に向いています。
他言語との違いにも触れておきます。Pythonでも同じように*argsという書き方をしますが、Rubyでは変数名は自由です(*numbersや*argsなど好きな名前でOK)。C言語系の言語では可変長引数の扱いがもっと複雑なことが多く、Rubyは比較的シンプルに書ける部類に入ります。
キーワード引数(**kwargs)にも軽く触れる
さらに一歩進んだ書き方として、**(ダブルスプラット)を使うと、「名前=値」の形式で渡された引数をハッシュ(他言語でいう辞書型・マップに近いデータ構造)としてまとめて受け取れます。
def profile(**options) puts options end profile(name: "田中", age: 30) # => 名前と値のハッシュ(Rubyのバージョンによって表示形式は多少異なります)
設定項目が多いメソッドを作るときに、options[:name]のように名前で値を取り出せるため、コードの可読性が上がります。ただし初心者のうちは、まずデフォルト引数と*argsの使い分けに慣れることを優先し、**kwargsは「こういう書き方もある」程度に覚えておけば十分です。
実務での注意点
デフォルト引数や可変長引数を使うと呼び出し側は楽になりますが、多用しすぎるとメソッドが「何を渡せば何が起きるか」分かりにくくなるという副作用もあります。特にチームで開発する場合は、引数の意味をコメントやメソッド名で明確にしておくことが大切です。また、デフォルト引数に配列やハッシュのような「変更可能なオブジェクト」を使うと、意図せず値が共有されて予期しないバグにつながることがあるため注意しましょう。
まとめ
デフォルト引数は「省略時の初期値を決める」、可変長引数は「引数の個数を柔軟にする」ための仕組みです。どちらもRubyのメソッドを書きやすくする便利な機能ですが、使いすぎるとかえって分かりにくくなることもあるので、必要な場面で適切に使うことを意識してみてください。
関連記事
本ページはプロモーションを含みます。
参考書籍(PR)
Rubyをもっと学びたい方には「プロを目指す人のためのRuby入門[改訂2版]」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動くWindows専用の自動化ツールをオーダーメイドで作成しています。気になる方はこちらをご覧ください。
コメント
コメントを投稿