Javaには次のものがあります。
public void someMethod(int ... intArray) { // question: what is the equivalent to "..."
// do something with intArray
}
Scalaで同じ機能を実現するにはどうすればよいですか?つまり、未定義の数のパラメーターをメソッドに渡しますか?
Javaには次のものがあります。
public void someMethod(int ... intArray) { // question: what is the equivalent to "..."
// do something with intArray
}
Scalaで同じ機能を実現するにはどうすればよいですか?つまり、未定義の数のパラメーターをメソッドに渡しますか?
Java と Scala の両方に varargs があり、どちらも最後のパラメーターに対してのみサポートしています。
def varargTest(ints:Int*) { ints.foreach(println) }
この記事から、違いは varargs 引数に使用される型にあります。
「*」は、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: _*) }
def someMethod(values : Int*)
配列を与えます。可変引数パラメーターを最後の仮パラメーターとして配置します。