[Scala] 可変長引数

 可変長引数に関するちょっとしたメモです。

可変長引数

 適当な個数の引数を任意にとれる便利な便利な可変長引数ですが、もちろんScalaでも使うことができます。

def method(args: String *) = {}

 みたいに、型名の後に「*」(アスタリスク)を打つと、その部分が可変長引数になります。また、Javaでは可変長引数部分は配列として扱うことが出来ましたが、ScalaではSeqとして扱います。扱うには特に難しいことはないのですが、Javaと違って配列をそのまま渡すような使い方はできません。

 が、Java同様に(厳密には同様に、ではないんだけど)Seq型の値を渡すことができます。その時は「_*」シンボルを利用します。

val l = List("a", "b", "c")
method(l) // エラー!

 ListはSeqの一種ですが、上記のコードをコンパイルするとエラーになります。ここでは以下のように記述することでコンパイルすることができます。

val l = List("a", "b", "c")
method(l: _*) // OK

 また、可変長引数として受け取った値もSeq型として扱われますので、もう一度可変長引数部分として渡してやりたい場合も、上記のように_*シンボルを指定する必要があります。

def method(args: String *) = {}
def wrapper(args: String *) = method(args: _*) // ここ!

val l = List("a", "b", "c")
wrapper(l: _*)

 それだけ。

 余談ですが、Scalaでは可変長引数のことを「repeated parameters」って言うらしいですね。一般的には「variable arguments」とか「variable argument list」とか言ってるような気がしないんでもないんですけど、「*」が付いてるとなんとなくその型の繰り返し(repeated)が続くことを表している感じでわかりやすい、ような気がするかも。parameterとかargumentって言ってるんだし、宣言定義の方は「repeated parameters」で、実際に呼び出してる部分は「variable arguments」な印象。すごくどうでもいい。

0 件のコメント :

コメントを投稿