Java有:
public void someMethod(int ... intArray) { // question: what is the equivalent to "..."
// do something with intArray
}
如何在Scala中实现相同的功能?也就是说,将未定义数量的参数传递给方法?
答案 0 :(得分:49)
Java和Scala都有varargs,两者都只支持最后一个参数。
def varargTest(ints:Int*) { ints.foreach(println) }
从this article开始,区别在于用于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节提到:
参数部分的最后一个值参数可以以“
*”
为后缀,例如(..., x:T *)
。
然后,该方法内的这种重复参数的类型 序列类型scala.Seq[T]
。
重复参数T*
的方法采用可变数量的T
类型的参数。
(T1, . . . , Tn,S*)U => (T1, . . . , Tn,S, . . . , S)U,
此规则的唯一例外是,如果通过
_*
类型注释将最后一个参数标记为序列参数。
(e1, . . . , en,e0: _*) => (T1, . . . , Tn, scala.Seq[S]).
注意:请注意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: _*) }
答案 1 :(得分:43)
def someMethod(values : Int*)
给出一个数组。将变量参数参数作为最后一个形式参数。