2009-06-04 3 views
1

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

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

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

ответ

6

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

В настоящей библиотеке коллекции 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) 
+0

Хмммм. Мне кажется, что, создавая два типа, называемых Map, обе расширяющиеся коллекции.Map, но по-разному ведут себя, создатели библиотеки Scala уже создали ситуацию, в которой я могу «испортить, рассматривая [что-то] как изменчивое, когда [он] неизменен». Если бы они не хотели, чтобы это было так, они не должны иметь общий супертип! –

+0

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

0

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

+0

Но неизменяемая карта * * определяет оператор ++! Это мой вопрос! Он возвращает (новую) карту с добавлением отображения. Если использование scala.collection.Map неявно является неизменяемой Картой, я не понимаю, почему она не может быть функциональной. В конце концов, они вряд ли изменят Predef, не так ли? –

+0

Действительно, поскольку Дэвид Хол указал, что мое предположение может не состояться. scala.collections.Map наследует от scala.collections.generic.MapTemplate, который обеспечивает «++» (неизменяемую) операцию. См., Однако, аннотации устаревших объектов в методах ++ в MutableMapTemplate (который наследуется командой scala.collections.mutable.Map) –

+0

(Я смотрел на источники магистрали 2.8 svn) –

1

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

Смежные вопросы