Почему некоторые классы коллекции имеют «пустой» метод экземпляра в дополнение к методу класса? - PullRequest
3 голосов
/ 09 февраля 2011

Оба существуют, например, здесь:

Map.empty[Int, Int]
Map(1 -> 41).empty

Set().empty
Set.empty

Но здесь существуют только методы класса:

List.empty        //OK
List(1,2,3).empty //Doesn't exist

Array.empty       //OK
Array("a").empty  //Doesn't exist

Не является ли empty идеальным случаем для метода класса (и не должен ли метод экземпляра empty быть объявлен устаревшим)?

Или должен ли метод экземпляра empty быть добавлен к классам, в которых он отсутствует?зрения, что затрудняет использование только empty в качестве метода класса (например, вывод типа, типы с более высоким родом, ...).

PS: было предложено, чтобы Карты со значениями по умолчанию было сложнеедостичь без экземпляра метода empty:

Map[Int, Int](1->2, 21->42).withDefault(_*2).empty

Что вы думаете?

Ответы [ 3 ]

2 голосов
/ 09 февраля 2011

Это правда, empty может быть методом в экземпляре класса.Причина, по которой это требуется для наборов и карт, заключается в том, что они реализуют свои сборщики, используя этот метод.Я предполагаю, что причина, по которой он не был включен в другом месте, заключается в том, что это не был типичный вариант использования.

1 голос
/ 09 февраля 2011

Интересно, почему Map имеет empty, а не наоборот? В конце концов, это не операция, которую вы делаете с чем-то, это просто экземпляр чего-либо.

В любом случае:

(List(1, 2, 3): Traversable[Int]).companion.empty

Я положил туда Traversable, чтобы показать это произведение для любой коллекции.

0 голосов
/ 09 февраля 2011

есть только неизменный список. Существует только один экземпляр EmptyList, поэтому пустой уровень класса не имеет смысла.

Черта Map может быть реализована с помощью mutables, поэтому вам нужно несколько экземпляров.

... Я думаю, что-то упущено в этом объяснении, но, возможно, это начало.

...