この記事で学ぶこと
- Scalaの反復パラメータ(Repeated Parameters)にListどどうやって渡すか
反復パラメータとは?
引数の数が決まってない引数のことを反復パラメータと言うと思う。または、連続パラメータと言ったり可変長引数と言うみたい。英語ではRepeated Parameters、varargs, Variable Argumentsと言うらしい。
例えば、反復パラメータを持つ関数:
def doSomething(args: String*) = args
この関数は引数の数が決まっていないので、引数の数を変えて呼び出すことができる
doSomething("a")
//> res0: Seq[String] = WrappedArray(a)
doSomething("a", "b")
//> res1: Seq[String] = WrappedArray(a, b)
doSomething("a", "b", "c")
//> res0: Seq[String] = WrappedArray(a, b, c)
Listを渡したい
こんなふうに、Listで渡したい時がある
val args = List("a", "b", "c")
doSomething(args)
しかし、これは型が一致しないのでエラーになる。
type mismatch; found : List[String] required: String
Listを渡す方法: _*
シンボルをつける
_*
シンボルをつけることで渡すことができる
val args = List("a", "b", "c")
//> args : List[String] = List(a, b, c)
doSomething(args:_*)
//> res3: Seq[String] = List(a, b, c)
あれ、でも引数として文字列を渡した時は
//> res0: Seq[String] = WrappedArray(a, b, c)
となるのに、List:_* で渡した時は
//> res3: Seq[String] = List(a, b, c)
になるぞ・・・・
どうやら Array にすると同じ振る舞いになるらしい
Listに対して toArray
したものを _*
シンボルで渡すと、文字列を直接渡した時と同じ振る舞いになるらしい。
doSomething(List("a", "b", "c").toArray:_*)
//> res4: Seq[String] = WrappedArray(a, b, c)
ということは最初からArrayにしておけばいいのかな
doSomething(Array("a", "b", "c"):_*)
//> res5: Seq[String] = WrappedArray(a, b, c)