Является ли Traversable чертой или классом

Вопрос 1 –

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

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

val v1 = Iterator(1,2,3)

v1.foreach( println _)

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


person Manu Chadha    schedule 29.11.2016    source источник


Ответы (1)


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

Вопрос 2: Да, Traversable — это трейт наверху иерархии коллекций в Scala. 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 числа.

person marstran    schedule 29.11.2016
comment
Спасибо. Есть ли причина для создания объекта-компаньона? Я не вижу сценария, в котором я буду использовать объект Traversable или Iterable. - person Manu Chadha; 29.11.2016
comment
Сопутствующий объект обычно содержит несколько создателей класса. Сопутствующий объект всегда определяется в том же файле, что и класс, и имеет то же имя, что и класс. Документацию по API для объекта-компаньона Traversable можно посмотреть здесь: scala-lang.org/api/2.12.0/scala/collection/Traversable$.html - person marstran; 29.11.2016