Scala如何在方法定义中接收多个参数?
2022-09-01 11:10:35
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规范的第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: _*) }
def someMethod(values : Int*)
给出一个数组。将变量参数参数作为最后一个正式参数。