Scala 可變長參數
阿新 • • 發佈:2019-01-22
lan ted error: 轉換 需要 pri rdquo 嘗試 緩沖 的 args 的類型實際上是
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。 轉自:http://www.zhihu.com/question/21622725
Scala 允許你指明函數的最後一個參數可以是重復的。這可以允許客戶向函數傳入可變長度參數列表。想要標註一個重復參數,在參數的類型之後放一個星號。
例如:定義一個可變參數的函數param
def param(args: String*) = for (arg <- args) println(arg)
這樣定義, echo 可以被零個至多個 String 參數調用:
//單個參數 param("one") one // 多個參數 param("hello", "world!") hello world!
函數內部,重復參數的類型是聲明參數類型的數組。
因此, param函數裏被聲明為類型" String*"
Array[String]
。然而,如果你有一個合適類型的數組,並嘗試把它當作
重復參數傳入,你會得到一個編譯器錯誤:
scala> val array= Array("hello", "world", "doc") arr: Array[java.lang.String] = Array("hello", "world", "doc") scala> param(arr) <console>:7: error: type mismatch; found : Array[java.lang.String] required: String param(arr)
要實現這個做法,你需要在數組參數後添加一個冒號和一個 _*
符號,像這樣:
scala> param(array: _*)
hello
world
doc
這個標註告訴編譯器把 arr 的每個元素當作參數,而不是當作單一的參數傳給 echo 。因此當形參為String*時,不能直接把類型為Array[String]的實參直接傳入,需要通過:_*進行轉換。
擴展:下劃線的用法
1、作為“通配符”,類似Java中的*。如import scala.math._2、:_* 作為一個整體,告訴編譯器你希望將某個參數當作參數序列處理!例如val s = sum(1 to 5:_*)就是將1 to 5當作參數序列處理。
又如要對緩沖數組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。 轉自:http://www.zhihu.com/question/21622725
Scala 可變長參數