#20 Scalaで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

はじめに

Scalaの関数の書き方に慣れてきたら、次に押さえたいのが関数をもっと柔軟にする書き方です。今回はデフォルト引数(引数を省略したときに自動で使われる値)と可変長引数(渡す値の個数を自由に変えられる引数)の2つを取り上げます。どちらも比較的シンプルな書き方で実現できるので、安心して読み進めてください。

デフォルト引数とは何か

デフォルト引数とは、関数を呼び出すときに値を渡さなかった場合に、あらかじめ決めておいた値が自動的に使われる仕組みです。「引数を省略できる」と考えるとイメージしやすいでしょう。

def greet(name: String, message: String = "こんにちは"): String = {
  s"$name さん、$message"
}

println(greet("田中"))            // 田中 さん、こんにちは
println(greet("鈴木", "おはよう")) // 鈴木 さん、おはよう

引数の型のあとに = 値 を書くだけで、その引数はデフォルト引数になります。JavaやC言語では引数の数だけ関数を用意する「オーバーロード」でこれに近いことを実現しますが、Scalaでは1つの定義だけで済むのが特徴です。

途中の引数だけ省略したいとき

デフォルト引数を複数指定していて、途中の引数だけを省略したい場合は「名前付き引数」を使います。

def order(item: String, quantity: Int = 1, note: String = ""): String =
  s"$item を $quantity 個(備考: $note)"

println(order("りんご", note = "贈答用"))

名前付き引数(note = "贈答用"のように引数名を明示する書き方)を使わずに位置だけで途中を省略しようとすると、コンパイルエラーになります。省略されやすい引数ほど後ろに置く、という並び順を意識すると使いやすい関数になります。

可変長引数とは何か

可変長引数(varargsとも呼ばれます)とは、呼び出す際に渡す引数の個数を0個からいくつでも自由に決められる仕組みです。合計を求める関数などで便利です。

def sum(numbers: Int*): Int = numbers.sum

println(sum())           // 0
println(sum(1, 2, 3))    // 6
println(sum(10, 20))     // 30

型のあとに *(アスタリスク)を付けるだけで可変長引数になります。関数の内部では渡された値は自動的に Seq(順序付きのリストのようなデータ構造)としてまとめて扱われるため、mapやsumなどのメソッドをそのまま使えます。

配列やリストを渡すときの注意点

すでに配列やリストの形でデータを持っている場合、そのまま可変長引数の関数に渡すとコンパイルエラーになります。ここがScala特有のつまずきポイントです。末尾に : _* という記号を付けて「この配列の中身を展開して渡す」と明示する必要があります。

val nums = Array(4, 5, 6)
println(sum(nums: _*))  // 15

この : _* を忘れると「配列1個」を渡そうとしてしまい、型が合わずエラーになります。Pythonの*argsに慣れている方は、展開の書き方が違う点に注意しましょう。

組み合わせるときの注意

デフォルト引数と可変長引数を1つの関数で両方使うことも可能です。ただし可変長引数は引数リストの一番最後に置くというルールがあるため、デフォルト引数はそれより前に置く必要があります。

def report(title: String, level: String = "info", tags: String*): String =
  s"[$level] $title (tags: ${tags.mkString(", ")})"

println(report("処理完了"))
println(report("警告発生", "warn", "db", "timeout"))

ログ出力の関数でよく使われる組み合わせですが、引数が増えすぎる場合は設定用クラス(ケースクラス)への置き換えも検討しましょう。

まとめ

今回はScalaの関数を柔軟にするデフォルト引数と可変長引数を紹介しました。デフォルト引数は「引数を省略できるようにする」仕組みで、名前付き引数と組み合わせると読みやすくなります。可変長引数は「渡す値の個数を自由にする」仕組みで、配列を渡すときは: _*を忘れないようにしましょう。どちらもオーバーロードを何個も書く手間を省いてくれる便利な機能です。

関連記事


本ページはプロモーションを含みます。

参考書籍(PR)

Scalaをもっと学びたい方には「実践Scala入門」がおすすめです。


PR

コードを書かずに自動化したい方へ

「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本