2016-11-29 2 views
1

Вопрос 1 -ли Traversable черта или класс

В документации Scala, я обнаружил, что 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 отличается от других классов, таких как список или массив? Приходит ли он под Seq, Set или категории карт (я думал, что другая коллекция наследует от проходимой)

Вопрос 3 - я мог бы сделать то же самое для Iterable признака, даже если согласно документации, Iterable имеет абстрактный метод, iterator :

val v1 = Iterator(1,2,3) 

v1.foreach(println _) 

Что мне не хватает?

ответ

5

Вопрос 1: Когда вы делаете Traversable(1,2,3), вы на самом деле вызываете метод apply на спутнике объекта Traversable. Этот метод фактически создает List с элементами, которые вы предоставили (List распространяется Traversable). Таким образом, метод foreach, который вы вызываете, фактически является методом foreachList.

Вопрос 2: Да, Traversable - это черта в верхней части иерархии коллекций в Скале. List и Array являются фактическими примерами некоторых конкретных коллекций, а Traversable - общая черта, которую реализует множество коллекций.

Вопрос 3: Iterable и Iterator - это не то же самое. Кажется, вы смешиваете их в вопросе. Iterable(1,2,3) делает то же самое, что и Traversable(1,2,3). Он называет метод apply на сопутствующем объекте Iterable и дает List. Iterator(1,2,3), однако, вызывает метод apply на Iterator и дает вам новый Iterator, который выполняет итерации через 3 числа.

+0

Спасибо. Есть ли причина создания сопутствующего объекта? Я не вижу сценарий, где я буду использовать объект Traversable или Iterable. –

+0

Сопутствующий объект обычно содержит некоторых создателей для класса. Сопутствующий объект всегда определяется в том же файле, что и класс, и имеет то же имя, что и класс. Вы можете увидеть документы API для сопутствующего объекта «Traversable» здесь: http://www.scala-lang.org/api/2.12.0/scala/collection/Traversable$.html – marstran

Смежные вопросы