#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専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿