В чем разница между «чертой» и «чертой шаблона»? - PullRequest
21 голосов
/ 05 января 2011

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

Ответы [ 3 ]

22 голосов
/ 05 января 2011

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

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

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

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

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

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

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

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

и

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

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

22 голосов
/ 05 января 2011

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

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

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

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

[1] кредит переходит к michid по этой ссылке

0 голосов
/ 05 января 2011

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

Для очень подробного и доступного обзора прочитайте Архитектура коллекций Scala .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...