2013-06-25 23 views
1

我發現了一段代碼,我前一段時間使用_ *從列表中創建了一個扁平集的物體。如何解釋「Set(someList:_ *)」的結果與「Set(someList).flatten」相同

真正的代碼行有點複雜,因爲我不清楚爲什麼會出現這種情況,需要進行一些實驗來了解效果,這在以下REPL會話中非常簡單:

scala> val someList = List("a","a","b") 
someList: List[java.lang.String] = List(a, a, b) 

scala> val x = Set(someList: _*) 
x: scala.collection.immutable.Set[java.lang.String] = Set(a, b) 

scala> val y = Set(someList).flatten 
y: scala.collection.immutable.Set[java.lang.String] = Set(a, b) 

scala> x == y 
res0: Boolean = true 

正如沒有扁平化會發生什麼參考:

scala> val z = Set(someList) 
z: scala.collection.immutable.Set[List[java.lang.String]] = Set(List(a, a, b)) 

正如我不記得在哪裏我得到那個成語從我想聽到什麼是真正發生的事情和如果在某種方式上或在另一方面(旁邊有任何後果s的可讀性影響)

PS:也許作爲過度使用Scala語言(恕我直言)下劃線的影響,它是很難找到有關它的一些用例的文檔,特別是如果它與一個符號通常在大多數搜索引擎中用作通配符。

回答

4

_*是擴大這個集合,如果它是在這裏從字面上寫的,所以

val x = Set(Seq(1,2,3,4): _*) 

相同

val x = Set(1,2,3,4) 

然而,Set(someList)對待someList作爲一個參數。

查找時髦的符號,你可以使用symbolhound

+0

感謝@ OM-NOM-NOM爲好,簡潔的答案,也爲symbolhound尖端(我記得我用過的東西像谷歌代碼搜索,但它接縫死現在)。 此外,我已經閱讀了關於類型歸屬的一些東西,應該是這個背後的概念性的東西:_ *,在這個其他問題中看到:http://stackoverflow.com/questions/2087250/what-is-the-purpose-的型歸屬功能於階 – Oswaldo