30

Javaには次のものがあります。

public void someMethod(int ... intArray) { // question: what is the equivalent to "..." 
    // do something with intArray
}

Scalaで同じ機能を実現するにはどうすればよいですか?つまり、未定義の数のパラメーターをメソッドに渡しますか?

4

2 に答える 2

49

Java と Scala の両方に varargs があり、どちらも最後のパラメーターに対してのみサポートしています。

 def varargTest(ints:Int*) { ints.foreach(println) }  

この記事から、違いは varargs 引数に使用される型にあります。

  • Java の配列
  • Seq (Sequence) for Scala: 反復可能で、コレクション foreach、map、filter、find などの多くのメソッドが利用可能

「*」は、0 個以上の引数を表します。

注: パラメータ値がリストなどのシーケンスとして既に「パッケージ化」されている場合、失敗します。

# varargTest(List(1,2,3,4,5))  
# //--> error: type mismatch;  
# //-->  found   : List[Int]  
# //-->  required: Int  
# //-->        varargTest(List(1,2,3,4,5))  
# //--> 

しかし、これは合格します:

  varargTest(List(1,2,3):_*)  
  //--> 1  
  //--> 2  
  //--> 3  

' _' は型推論のプレースホルダー ショートカットです。' _*' は、ここでは '繰り返しタイプに適用されます。Scala Specification
のセクション 4.6.2 には次のように記載されています。

パラメータ セクションの最後の値パラメータには、「<code>*」</code> のようにサフィックスを付けることができます (..., x:T *)
メソッド内で繰り返されるこのようなパラメーターの型は、シーケンス型scala.Seq[T]です。
繰り返しパラメーターを持つメソッドはT*、 type の可変数の引数を取りますT

 (T1, . . . , Tn,S*)U => (T1, . . . , Tn,S, . . . , S)U, 

このルールの唯一の例外は、最後の引数が_*型注釈によってシーケンス引数としてマークされている場合です。

 (e1, . . . , en,e0: _*) => (T1, . . . , Tn, scala.Seq[S]).

注 2: Java の基になる型の消去に注意してください。

//--> error: double definition:
//--> method varargTest:(ints: Seq[Int])Unit and
//--> method varargTest:(ints: Int*)Unit at line 10
//--> have same type after erasure: (ints: Sequence)Unit
//-->   def varargTest(ints:Seq[Int]) { varargTest(ints: _*) }
于 2009-09-17T13:26:41.967 に答える
46
def someMethod(values : Int*)

配列を与えます。可変引数パラメーターを最後の仮パラメーターとして配置します。

于 2009-09-17T13:10:57.767 に答える