scala collection.Map не может быть добавлен в - PullRequest
1 голос
/ 04 июня 2009

Почему я не могу добавить к scala.collection.Map? Кажется, что trait довольно бесполезен без этой функциональности.

Не могли бы они переопределить метод ++ в Iterable и уменьшить тип возвращаемого значения до Map?

P.S. Я не имею в виду, что он должен быть mutable , просто он должен иметь возможность вернуть новый Map с добавленным отображением (или отображениями), такой же, как immutable.Map.

Ответы [ 3 ]

6 голосов
/ 11 июня 2009

Я оставлю оригинальный ответ ниже, хотя он в значительной степени неверен, так как я не правильно понял вопрос.

Существующая библиотека коллекций Scala в значительной степени обеспечивает различные методы добавления для изменяемых / неизменяемых объектов, вероятно, в надежде прояснить в исходном коде, какой тип коллекции используется. Как уже говорилось, это пересматривается в 2.8, и эта предпосылка исчезает.

В таком случае абстрактные классы не предоставляют методы, о которых вы думаете, потому что они могут существовать для неизменяемого, но не для изменяемого, и наоборот. Или они могут иметь одинаковое имя , но разные реализации.

И, следовательно, было бы невозможно предоставить их в базовом классе.

Но, кроме того, обратите внимание, что таким образом, если вы получаете scala.collection.map, вы не можете испортить его, рассматривая его как изменяемый, когда вы получили неизменяемый, или наоборот.

А теперь неправильный ответ. :)

Вы можете (нет, вы не можете - код ниже использует scala.collection.imutable.Map).

scala> val x = Map(1 -> 'a', 2 -> 'b')
x: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b)

scala> x ++ Map(3 -> 'c')
res5: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b, 3 -> c)

scala> var y = x
y: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b)

scala> y += (3 -> 'c')

scala> y
res7: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b, 3 -> c)

scala> x + (3 -> 'c')
res8: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b, 3 -> c)
1 голос
/ 04 июня 2009

Библиотека коллекций Scala в настоящее время довольно несовершенна. 2.8 (которая должна быть выпущена через месяц или около того) имеет полностью обновленную библиотеку коллекций, которая, как мне кажется, соответствует вашему желанию.

0 голосов
/ 04 июня 2009

Мое предположение: Если у вас есть какая-то коллекция и вам нужно предоставить фасад «Только для чтения» для других, эта черта подходит для работы как есть. Если вы добавите туда дополнение, это не будет ортогональным дизайном, так как тогда потребуется интерфейс карты только для чтения. С другой стороны, если требуется операция ++ в универсальном интерфейсе, она не подойдет как для изменчивых, так и для неизменных реализаций. Например. если изменяемая коллекция вернула себя при добавлении, не будет очевидным, что произойдет, просто взглянув на интерфейс.

...