LoginSignup
5
6

More than 5 years have passed since last update.

Scala: 反復パラメータ(Repeated Parameters)にListで渡す方法

Last updated at Posted at 2014-03-13

この記事で学ぶこと

  • 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)
5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6