Какой вариант использования функции компаньона Scala List, возвращающей GenericCompanion? - PullRequest
2 голосов
/ 20 декабря 2011

Я читаю Scala List API . Я не мог понять, как использовать функцию компаньона ниже.

def companion : GenericCompanion[List]

The factory companion object that builds instances of class List.

Кажется, это предназначено для некоторых функций в Списке, но не для конечных пользователей, чтобы использовать это непосредственно. Если это так, как можно узнать, что функция не будет использоваться разработчиком приложения напрямую? Конечно, это только мое обоснованное предположение, и я хотел бы исправить его, если я ошибаюсь.

Ответы [ 2 ]

4 голосов
/ 20 декабря 2011

Не зная деталей выбора дизайна в библиотеке коллекций, я думаю, что вижу здесь два варианта использования:

  1. DRY.В некоторой степени внутренний, но наличие объекта-компаньона, который действует как фабричное здание из построителя конкретного типа, является общим шаблоном в библиотеке коллекций, поэтому рефакторинг его в класс, составляемый каждой реализацией коллекции, уменьшает дублирование.

  2. Абстракция.Предоставление «компаньона» предоставляет клиентскому коду средство для создания новой коллекции того же типа, что и экземпляр, не обязательно зная, что это за тип.Это было бы полезно, если вы хотите создать более общие функции обработки коллекций, которые возвращают согласованные типы.

Вот несколько примеров того, как это может быть полезно:

scala> val a: Traversable[Int] = Set(1,2,3,4)
a: Traversable[Int] = Set(1, 2, 3, 4)

scala> a.companion(1,2,3)
res1: Traversable[Int] = Set(1, 2, 3)

scala> val b: Traversable[Int] = List(1,2,3,4)
b: Traversable[Int] = List(1, 2, 3, 4)

scala> b.companion(1,2,3)
res2: Traversable[Int] = List(1, 2, 3)

scala> def ends[T](c: Traversable[T]) : Traversable[T]= {
|        c.companion(c.head, c.last)
|      }
ends: [T](c: Traversable[T])Traversable[T]

scala> ends[Int](List(1,2,3,4,5))
res3: Traversable[Int] = List(1, 5)

scala> ends[Int](Set(1,2,3,4,5))
res4: Traversable[Int] = Set(5, 4)

Обратите внимание, что «конец» не знает, какой подтип Traversable он получает, но может вернуть новую коллекцию совместимого типа, созданную с использованием компаньона.

3 голосов
/ 20 декабря 2011

Идея состоит в том, что признак в верхней части иерархии может получить компаньона (и составителей, содержащихся в нем), чтобы он мог построить коллекцию типа коллекции в нижней части иерархии.Только я не знаю, где именно он используется, поскольку уже существует метод newBuilder, который обеспечивает это.

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