2011-01-05 3 views
20

Глядя на scaladoc для Traversable и TraversableLike, мне сложно определить, какая разница между ними (за исключением того, что одна расширяет другую). Единственная очевидная разница в документации заключается в том, что он говорит, что Traversable является «признаком», а TraversableLike - «шаблонной чертой». Но googling для «шаблонной черты» не раскрывает определения для этого термина. Помогите!В чем разница между «признаком» и «шаблоном»?

ответ

21

Я не видел эту терминологию в общем использовании в Scala, и я думаю, что она специфична для дизайна API коллекций Scala. Вы можете узнать больше, прочитав The Architecture of Scala Collections (особенно раздел «Факторизация общих операций») [1] и the Scala collections SID. §4.2 SID имеет значение, хотя они упоминаются как «черты реализации»:

Классы коллекции, такие как Traversable или Vector, наследуют все их конкретные реализации методов из признака реализации. Эти черты называются с атрибутом Like suf fix; например VectorLike - это признак реализации Vector и TraversableLike - это признак реализации для Traversable.

Короче говоря, их цель заключается как в отдельную реализацию для использования вне иерархии коллекций (например StringOps распространяется TraversableLike но не Traversable) и вынесут общие операции, таким образом, что сохраняется тип коллекции (см IttayD's answer для более подробного объяснения).

Следует отметить, что вам действительно не нужно беспокоиться об этих классах, если вы не расширяете иерархию коллекций. Для обычного использования, сосредоточьтесь на Traversable, Iterable, Seq и т. Д. Черты. Если вы новичок в API Scala Collections, я бы предложил начать с Scala 2.8 Collection API document, а затем указать scaladoc при необходимости. Вы не можете рассчитывать на «большую картину», просматривающую скаладок.

[1] Заслуга michid по этой ссылке

+2

Благодарим вас за отличный ответ! Однако последнее предложение немного огорчило меня: «вы не можете ожидать, что« большая картина »просматривается через скаладок» - как неудачно ... Я чувствую, что в случае стандартной библиотеки Java (по крайней мере для «основных» пакетов java.lang, java.util и т. д., которые были вокруг с 1.1), что я смог получить большую картину, просмотрев javadoc. – Adam

22

В XXXLike черта играет важную роль добавления Repr общего параметра. Методы, которые должны возвращать один и тот же тип коллекций, например фильтр, map, flatMap, реализуются с чертами низкого уровня (TraversableLike). Для того, чтобы кодировать их тип возврата, эти черты получить его:

trait TraversableLike[+A, +Repr] ... 
    ... 
    def filter(p: A => Boolean): Repr = { 

(для карты и flatMap вопрос является более сложным, я не буду вдаваться в подробности здесь)

Теперь у вас есть новый тип коллекция. Вы можете сделать:

trait MyCollection[+A] extends TraversableLike[A, MyCollection] 

Но если кто-то хочет расширить свою коллекцию, они застряли возвращаемые значения MyCollection из различных унаследованных методов.

Так вместо этого, вы создаете:

trait MyCollectionLike[+A, +Repr] extends TraversableLike[A, Repr] 

и

trait MyCollection[+A] extends MyCollectionLike[A, MyCollection] 

и любой, кто хочет расширить свою коллекцию расширяет MyCollectionLike

+0

IttayD, это должно быть FAQ № 1 на веб-сайте Scala. Существует, по крайней мере, три разных способа снять эти «возвращаемые типы этого метода, такие же, как и унаследовавший класс» - знание того, какой из них использовался для библиотеки коллекций Scala (и, следовательно, это предпочтительный механизм), является чем-то нужно показать больше начинающих Scala. – Adam

1

код [...] Как классы классы реализации для реальных классов сбора.В некотором смысле они действуют как реализация шаблонов, из которых большинство - если не все - поведение наследуется фактическими классами коллекции.

Для получения подробного и доступного обзора читайте The Architecture of Scala Collections.

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