これがJavaでできることです。繰り返されたパラメーターの結果を取得し、それを別のメソッドに渡します。
public void foo(String ... args){bar(args);}
public void bar(String ... args){System.out.println("count="+args.length);}
scalaでは次のようになります:
def foo(args:String*) = bar(args)
def bar(args:String*) = println("count="+args.length)
ただし、これはコンパイルされず、バーの署名は一連の個別の文字列を想定しており、渡される引数は文字列以外の構造です。
今のところ、私は配列を回しているだけです。スター付きのパラメータを使用すると非常に便利です。それを行う方法はありますか?
Javaは、配列args
を自動的に可変引数に変換することを前提としていますが、これは、Object型の可変引数を受け入れるメソッドでは問題になる可能性があります。
Scalaでは、引数を: _*
で指定することにより、明示的にする必要があります。
scala> def bar(args:String*) = println("count="+args.length)
bar: (args: String*)Unit
scala> def foo(args:String*) = bar(args: _*)
foo: (args: String*)Unit
scala> foo("1", "2")
count=2
: _*
は、Seq
の任意のサブタイプ、または暗黙的にSeq
に変換可能なもの、特にArray
で使用できます。
scala> def foo(is: Int*) = is.length
foo: (is: Int*)Int
scala> foo(1, 2, 3)
res0: Int = 3
scala> foo(Seq(1, 2, 3): _*)
res1: Int = 3
scala> foo(List(1, 2, 3): _*)
res2: Int = 3
scala> foo(Array(1, 2, 3): _*)
res3: Int = 3
scala> import collection.JavaConversions._
import collection.JavaConversions._
scala> foo(Java.util.Arrays.asList(1, 2, 3): _*)
res6: Int = 3
これは、セクション4.6.2の 言語リファレンス の例でよく説明されています。
これらの例はScala 2.8.0.RC2で作成されていることに注意してください。