Scala如何在方法定义中接收多个参数?

时间:2009-09-17 13:04:58

标签: java scala variadic-functions

Java有:

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

如何在Scala中实现相同的功能?也就是说,将未定义数量的参数传递给方法?

2 个答案:

答案 0 :(得分:49)

Java和Scala都有varargs,两者都只支持最后一个参数。

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

this article开始,区别在于用于varargs参数的类型:

  • array for Java
  • Scala的Seq(Sequence):它可以被迭代,并且可以使用许多方法,例如集合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节提到:

  

参数部分的最后一个值参数可以以“*”为后缀,例如   (..., 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*)

给出一个数组。将变量参数参数作为最后一个形式参数。