O (1) преобразование из mutable.Map в неизменяемое. Карта?
Есть ли способ конвертировать (обертывать) измененную карту в неизменяемую в O (1) раз (то есть не копировать значения, но аналогично тому, что сделано в JavaConversions)
Ответы
Ответ 1
Для изменчивых карт существует только для чтения.
scala> collection.mutable.Map(1->2).readOnly
res0: scala.collection.Map[Int,Int] = ro-Map(1 -> 2)
Как указано oxbow_lakes, базовая Карта по-прежнему изменена и может измениться после публикации клиентом прогноза только для чтения. Иллюзия неизменности должна решаться в коде, управляющем картой.
Ответ 2
Как указывает Томас, просмотр только для чтения - O (1). Но только для чтения не приравнивается к неизменности.
Разница хорошо описана в документе Fighting Bit Rot:
Все классы коллекций хранятся в пакет scala.collection. Этот пакет имеет три подпакета: изменяемый, неизменяемым и общим. Наиболее коллекции существуют в трех формах, в зависимости от их изменчивости.
Коллекция в пакете scala.collection.immutable является гарантируется неизменность для все. Это означает, что можно положиться на тот факт, что доступ к тому же ценность коллекции со временем всегда будет получить коллекцию с тем же элементы. Коллекция в упаковке scala.collection.mutable известен имеют некоторые операции, которые изменяют сбор на месте.
Коллекция в пакете scala.collection может быть измененным или непреложным. Например, collection.Seq [T] является суперклассом как collection.immutable.Seq [T], так и collection.mutable.Seq [Т]. В общем, корневые коллекции в пакете scala. коллекции определяют один и тот же интерфейс как неизменные коллекции, и измененные коллекции в пакете scala.collection.mutable обычно добавляют некоторая разрушительная модификация операции с этим неизменным интерфейс. Разница между корневые коллекции и неизменяемые коллекции состоит в том, что пользователь неизменяемая коллекция имеет гарантию что никто не может мутировать сбор, тогда как пользователи корневых коллекций предполагать модификации другими, даже если они не могут сами модификации.
Возможно, это просто просто как кастинг.
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)
Ответ 3
То, о чем вы просите, по своей сути небезопасно. Вы можете передать mutable.Map
вокруг как collection.Map
, который является неизменным, но "клиенты" с использованием этой формы не могут быть уверены, что их представление не изменится из-под них.
Ответ 4
В принципе можно добавить метод "замораживания" к изменяемой структуре данных, которая предотвратила дальнейшую мутацию. Это единственный даже слегка безопасный способ сделать упаковку. (Только немного, потому что после этого вам придется бросать исключения, когда вы пытались его мутировать.) Scala Измененные коллекции не имеют этой возможности. Можно добавить его, например, mutable.HashMap, переопределив все мутирующие методы (update
, +=
, ++=
и т.д.), но это будет справедливая работа.
Ответ 5
Работа Филиппа Халлера над Возможности для уникальности и заимствования связаны с этим. Там много других работ в области обеспечения "владения" через систему типов, но Филипп фактически предоставляет полезный плагин для компилятора Scala.