O (1) преобразование из изменяемого. Отобразитесь на неизменный. Карта?

Есть ли способ преобразовать (переносят) изменяемую Карту к неизменному в O (1) время (то есть, не путем копирования значений, но подобный тому, что сделано в JavaConversions),

14
задан Eugene Yokota 15 December 2010 в 21:33
поделиться

5 ответов

Существует проекция только для чтения для изменяемых карт.

scala> collection.mutable.Map(1->2).readOnly
res0: scala.collection.Map[Int,Int] = ro-Map(1 -> 2)

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

3
ответ дан 1 December 2019 в 13:47
поделиться

Как указывает Томас, представление только для чтения - это O (1). Но только чтение не означает неизменность.

Разница хорошо описана в статье « Борьба с гнилью »:

Все классы коллекций хранятся в пакете scala.collection. Этот пакет имеет три подпакета: изменяемый, неизменяемый и общий. Большинство коллекций существует в трех формах, в зависимости от их изменчивости.

Коллекция в пакете scala.collection.immutable гарантированно будет неизменной для всех. Это означает, что можно полагаться на тот факт, что доступ к одному и тому же значению коллекции с течением времени всегда дает коллекцию с теми же элементами . Известно, что коллекция в пакете scala.collection.mutable содержит некоторые операции, которые изменяют коллекцию .

Коллекция в пакете scala.collection может быть изменяемой или неизменной. Например, collection.Seq [T] является суперклассом как collection.immutable.Seq [T], так и collection.mutable.Seq [T]. Как правило, корневые коллекции в пакете scala. collection определяют тот же интерфейс , что и неизменяемые коллекции, и изменяемые коллекции в пакете scala.collection.mutable обычно добавляет операции деструктивного изменения к этому неизменяемому интерфейсу. Разница между корневыми коллекциями и неизменяемыми коллекциями заключается в том, что пользователь неизменяемой коллекции имеет гарантию , что никто не может изменить эту коллекцию, { {1}}, в то время как пользователи корневых коллекций должны принимать изменения, внесенные другими, даже если они не могут сами вносить изменения.

Возможно, это просто апкастинг.

scala> val mm = collection.mutable.Map(1 -> 2)
mm: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2)

scala> val readOnly = mm : collection.Map[Int, Int]
readOnly: scala.collection.Map[Int,Int] = Map(1 -> 2)
6
ответ дан 1 December 2019 в 13:47
поделиться

То, о чем вы просите, по своей сути небезопасно. Вы можете передать mutable. Map вокруг как коллекция . Map, которая неизменяема, но «клиенты», использующие эту форму, не могут быть уверены, что их представление не изменится из-под них.

3
ответ дан 1 December 2019 в 13:47
поделиться

В принципе, можно было бы добавить метод «замораживания» к изменяемой структуре данных, который предотвратил бы дальнейшие мутации. Это единственный, хотя бы немного безопасный способ обертывания. (Незначительно, потому что после этого вам придется генерировать исключения, когда вы пытаетесь его изменить.) Однако изменяемые коллекции Scala не имеют такой возможности. Его можно было бы добавить, например, к mutable.HashMap, переопределив все изменяющие методы ( update , + = , ++ = и т. д.), но это было бы неплохо.

3
ответ дан 1 December 2019 в 13:47
поделиться

Работа Филиппа Галлера Возможности для уникальности и заимствования связана с этим. Есть много другой работы в области обеспечения «владения» через систему типов, но Филипп фактически предоставляет полезный плагин для компилятора Scala.

2
ответ дан 1 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: