web-dev-qa-db-ja.com

In scala繰り返しパラメーターを他のメソッドに渡すことはできますか?

これが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)

ただし、これはコンパイルされず、バーの署名は一連の個別の文字列を想定しており、渡される引数は文字列以外の構造です。

今のところ、私は配列を回しているだけです。スター付きのパラメータを使用すると非常に便利です。それを行う方法はありますか?

31
Fred Haslam

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で作成されていることに注意してください。

47
retronym