kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

初学者向けの Scala Tips (4) - 可変長引数を取る関数にSeq[T]を渡す

TipsというよりFAQの部類ですが、ときどきつまづく方がいるようなので。

Scalaで以下のような可変長引数を取る関数printAllを定義すると、

def printAll(ss: String*): Unit = {
  ss.foreach(println)
}
printAll("BAZ", "FOO", "BAR")
//BAZ
//FOO
//BAR

のように任意個のStringを渡すことができます。問題は、既に

val fooBar = Seq("FOO", "BAR")

のように既にSeq型のオブジェクトが作られている場合。

fooBarをそのまま引数として渡し、printAll(fooBar)としてしまうと、

(snip) error: type mismatch;
 found   : Seq[String]
 required: String
printAll(fooBar)

というエラーが出てしまいます。これを解決するには、

printAll(fooBar:_*)
//FOO
//BAR

のようにすればOKです。このようにすれば、scalacがfooBarを可変長引数に一つずつ渡したものとして扱ってくれます。