Глядя на scaladoc для Traversable и TraversableLike, мне сложно определить, какая разница между ними (за исключением того, что одна расширяет другую). Единственная очевидная разница в документации заключается в том, что он говорит, что Traversable является «признаком», а TraversableLike - «шаблонной чертой». Но googling для «шаблонной черты» не раскрывает определения для этого термина. Помогите!В чем разница между «признаком» и «шаблоном»?
ответ
Я не видел эту терминологию в общем использовании в 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 по этой ссылке
В 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
IttayD, это должно быть FAQ № 1 на веб-сайте Scala. Существует, по крайней мере, три разных способа снять эти «возвращаемые типы этого метода, такие же, как и унаследовавший класс» - знание того, какой из них использовался для библиотеки коллекций Scala (и, следовательно, это предпочтительный механизм), является чем-то нужно показать больше начинающих Scala. – Adam
код [...] Как классы классы реализации для реальных классов сбора.В некотором смысле они действуют как реализация шаблонов, из которых большинство - если не все - поведение наследуется фактическими классами коллекции.
Для получения подробного и доступного обзора читайте The Architecture of Scala Collections.
- 1. В чем разница между темой и шаблоном?
- 2. В чем разница между шаблоном и курсом?
- 3. В чем разница между признаком и поведением в cakephp 3?
- 4. В чем разница между шаблоном шаблона JQuery и шаблоном метода
- 5. В чем разница между шаблоном расширения объектов и шаблоном адаптера?
- 6. В чем разница между шаблоном проектирования и шаблоном проектирования предприятия?
- 7. В чем разница между шаблоном стратегии и шаблоном посетителя?
- 8. В чем разница между шаблоном Builder и шаблоном Flyweight?
- 9. Разница между шаблоном стратегии и шаблоном делегирования
- 10. Разница между шаблоном состояния и шаблоном стратегии
- 11. разница между шаблоном и шаблоном макета
- 12. В чем разница между шаблоном include и static в Django?
- 13. в C# в чем разница между шаблоном стратегии и делегатами?
- 14. В чем разница между строкой запроса и шаблоном в Elasticsearch
- 15. В чем разница между XSL-шаблоном и XPath в синтаксисе?
- 16. разница между шаблоном Hibernate и шаблоном JDBC
- 17. В чем разница между шаблоном фасада и адаптера?
- 18. В чем разница между текстом/шаблоном и текстом/равным?
- 19. В чем разница между шаблоном Functor и Command?
- 20. В чем разница между шаблоном проектирования Flyweight и кэшем Java
- 21. В чем разница между шаблоном наблюдателя и реактивным программированием?
- 22. В чем разница между интерфейсом и шаблоном проектирования?
- 23. В чем разница между Powerpoint Theme и шаблоном Powerpoint?
- 24. В чем разница между рисунком фасада и шаблоном фабрики abstarct?
- 25. Zope 2: В чем разница между «шаблоном» и «представлением»?
- 26. В чем разница между ярким шаблоном, частичным и компонентом
- 27. В чем разница между шаблоном стратегии и инжекцией зависимостей?
- 28. В чем разница между шаблоном функции и функцией шаблона?
- 29. В чем разница между классом шаблона и шаблоном класса?
- 30. В чем разница между шаблоном проектирования интерпретатора и медиатора?
Благодарим вас за отличный ответ! Однако последнее предложение немного огорчило меня: «вы не можете ожидать, что« большая картина »просматривается через скаладок» - как неудачно ... Я чувствую, что в случае стандартной библиотеки Java (по крайней мере для «основных» пакетов java.lang, java.util и т. д., которые были вокруг с 1.1), что я смог получить большую картину, просмотрев javadoc. – Adam