scala> def echo(args: String*) =
for (arg <- args) println(arg) echo: (String*)Unit 这样定义, echo 可以被零个至多个 String 参数调用:scala> echo()
scala> echo("one") one scala> echo("hello", "world!") hello world! 函数内部,重复参数的类型是声明参数类型的数组。因此, echo 函数里被声明为类型“ String* ” 的 args 的类型实际上是 Array[String] 。然而,如果你有一个合适类型的数组,并尝试把它当作 重复参数传入,你会得到一个编译器错误:scala> val arr = Array("What's", "up", "doc?")
arr: Array[java.lang.String] = Array(What's, up, doc?) scala> echo(arr) <console>:7: error: type mismatch;found : Array[java.lang.String]
required: String echo(arr) ˆ 要实现这个做法,你需要在数组参数后添加一个冒号和一个 _* 符号,像这样:scala> echo(arr: _*)
What's up doc? 这个标注告诉编译器把 arr 的每个元素当作参数,而不是当作单一的参数传给 echo 。 def sum(args: Int*):Int={ var total:Int=0 for (arg <- args) { total=total+arg } total }val s = sum(1 to 5:_*)
下划线的用法
转自http://www.zhihu.com/question/21622725
1、作为“通配符”,类似Java中的*。如import scala.math._
2、:_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是将1 to 5当作参数序列处理。 3、指代一个集合中的每个元素。例如我们要在一个Array a中筛出偶数,并乘以2,可以用以下办法: a.filter(_%2==0).map(2*_)。 又如要对缓冲数组ArrayBuffer b排序,可以这样: val bSorted = b.sorted(_ 4、在元组中,可以用方法_1, _2, _3访问组员。如a._2。其中句点可以用空格替代。 5、使用模式匹配可以用来获取元组的组员,例如 val (first, second, third) = t 但如果不是所有的部件都需要,那么可以在不需要的部件位置上使用_。比如上一例中val (first, second, _) = t 6、还有一点,下划线_代表的是某一类型的默认值。 对于Int来说,它是0。 对于Double来说,它是0.0 对于引用类型,它是null。