2016-11-29 44 views
1

問題1 -是可遍歷一個特質或類

在斯卡拉的文檔,我發現Traversable的是一個抽象方法foreach一個特點:

http://www.scala-lang.org/docu/files/collections-api/collections.html

那麼,爲什麼能我實例化一個Traversable類型的對象?

val t = Traversable(1,2,3) 

t.foreach(println _) //where is Scala picking foreach a definition from? 

問題2 - 如何是可遍歷其它類,如列表或數組有什麼不同?它來下序列,設置或地圖類(我想其他集合從Traversable的繼承)

問題3 - 我可以做,即使按文檔,可迭代有一個抽象方法Iterable性狀完全相同,iterator

val v1 = Iterator(1,2,3) 

v1.foreach(println _) 

我在想什麼?

回答

5

問題1:當你做Traversable(1,2,3)時,你實際上調用apply-方法Traversable特性的伴隨對象。該方法實際上會創建一個帶有您提供的元素的ListList擴展爲Traversable)。因此您撥打的foreach方法實際上是Listforeach方法。

問題2:是的,Traversable是Scala中收集層次結構頂部的特徵。 ListArray是一些具體集合的實際例子,而Traversable是很多集合實現的一般特徵。

問題3:IterableIterator不是一回事。你似乎混淆了他們的問題。 Iterable(1,2,3)Traversable(1,2,3)完全相同。它調用Iterable的伴隨對象上的apply方法,併爲您提供List。然而,Iterator(1,2,3)Iterator上調用apply方法,併爲您提供了一個新的Iterator,它重複了3個數字。

+0

謝謝。是否有任何理由創建伴侶對象?我看不到我將使用Traversable或Iterable對象的場景。 –

+0

伴侶對象通常包含一些該類的創建者。伴隨對象始終與類相同的文件中定義,並且它與該類具有相同的名稱。您可以在這裏查看「Traversable」的伴侶對象的API文檔:http://www.scala-lang.org/api/2.12.0/scala/collection/Traversable$.html – marstran