あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

可変長引数(続き)

可変長引数を受け取る関数定義の引数の型は
Seq になっているので、List や Array を渡せそうだが
そのまま渡すとエラーになる。

scala> def puts(s: String*) = s.foreach(print)
puts: (s: String*)Unit

scala> val list = List("bar1 ", "bar2 ", "bar3 ")
list: List[java.lang.String] = List("bar1 ", "bar2 ", "bar3 ")

scala> puts(list)
<console>:10: error: type mismatch;
 found   : List[java.lang.String]
 required: String
       puts(list)

引数の後に : _* をつけると渡せる。

scala> puts(list: _*)
bar1 bar2 bar3

関数定義で可変長引数の関数に引数を渡す場合も
: _* をつけると渡せる。(つけないで渡すとエラーになる。)

scala> def foo(s: String*) = puts(s: _*)
foo: (s: String*)Unit

_* は、シーケンスを表すワイルドカードのパターンで
シーケンス内の全要素にマッチさせることができるらしい。