C'è un modo per convertire (involucro) un mutabile Mappa per immutabili nel tempo O (1) tempo (cioè non copiando i valori, ma simile a quello che viene fatto in JavaConversions)Conversione O (1) da mutable.Map a immutable.Map?
risposta
C'è una read only projection per mappe mutevoli
scala> collection.mutable.Map(1->2).readOnly
res0: scala.collection.Map[Int,Int] = ro-Map(1 -> 2)
Come oxbow_lakes pointed out sottostante mappa è ancora mutevole e potrebbe cambiare dopo la sola lettura di proiezione viene pubblicato ai clienti. L'illusione dell'immutabilità deve essere affrontata nel codice che gestisce la mappa.
Quello che chiedi è intrinsecamente pericoloso. Puoi passare lo mutable.Map
in giro come collection.Map
che è immutabile ma i "client" che utilizzano questo modulo non possono essere sicuri che la loro vista non cambierà da sotto di essi.
Il tuo punto è valido. La mappa di sola lettura funziona solo se la mappa sottostante non viene modificata dopo che i client hanno ricevuto un riferimento. L'utilizzo non è sicuro è questo rispetto. Questo è un compromesso e non sarà un grosso problema per i casi di utilizzo reale, purché tu pubblichi solo la proiezione di sola lettura, proprio come tu utilizzi java.util.Collections.unmodifiableMap. –
Trovo che io usi Java 'unmodifiableXyz' quando desidero passare qualche raccolta inizializzata al di fuori della classe che * possiede * it. Questo per dire che lo faccio nei casi in cui posso essere sicuro che i dati non cambieranno da sotto un lettore, desidero solo assicurarmi che un lettore non possa modificarlo. La mia soluzione sopra è quindi inadatta Penso che –
Come osserva Thomas, la vista di sola lettura è O (1). Ma la sola lettura non equivale a immutabilità.
La differenza è ben descrived nel "Fighting Bit Rot" carta:
Tutte le classi di raccolta sono conservati in un pacchetto scala.collection. Questo pacchetto ha tre sotto-pacchetti: modificabile, immutabile e generico. La maggior parte delle raccolte esiste in tre forme, a seconda della loro mutevolezza.
Una raccolta nel pacchetto scala.collection.immutable è garantita per essere immutabile per tutti. Ciò significa che ci si può affidare a per il fatto che l'accesso allo stesso valore di raccolta nel tempo corrisponderà sempre a e produce una raccolta con gli stessi elementi . Una collezione nel pacchetto scala.collection.mutable è nota a con alcune operazioni che modificano la raccolta in posizione.
Una raccolta nel pacchetto scala.collection può essere mutabile o immutabile. Ad esempio, la collezione .Seq [T] è una superclasse di entrambi collection.immutable.Seq [T] e collection.mutable.Seq [T]. Generalmente, le raccolte radice nel pacchetto scala. raccolta definire la stessa interfaccia le collezioni immutabili, e le collezioni mutabili nel pacchetto scala.collection.mutable tipicamente inserirlo alcuni distruttivi modifica operazioni di questa immutabile interfaccia . La differenza tra collezioni radice e immutabili collezioni è che un utente di una collezione immutabile ha una garanzia che nessuno può mutare la raccolta, mentre gli utenti di collezioni radice hanno assumere modifiche da altri, anche se non possono fare eventuali modifiche allo .
Forse è solo un semplice come up-casting.in linea di principio
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)
La differenza tra casting e map.readSolo è che l'utente può lanciare collection.Map su una mappa mutabile o usare reflection per cambiare la mappa. –
Buon punto. Sembra che la soluzione 2.8 di questo possa usare 'MapProxy', ma non riesco a racchiudere facilmente' collection.MapProxy 'attorno a 'colletion.mutable.Map'. ad esempio 'val mm = collection.mutable.Map (1 -> 2); nuova collezione.MapProxy [Int, Int] {val self = mm} ' – retronym
' MapProxy' è ora deprecato a partire da 2.11. – Mike
Si potrebbe aggiungere un metodo di "congelare" per una struttura di dati mutabile che impediva un'ulteriore mutazione. Questo è l'unico modo anche poco sicuro per eseguire il wrapping. (Solo leggermente perché dopo di ciò dovresti generare eccezioni quando provi a mutarlo.) Le collezioni mutabili di Scala non hanno questa capacità, comunque. Si potrebbe aggiungere ad es. mutable.HashMap sovrascrivendo tutti i metodi di muting (update
, +=
, ++=
, ecc.), ma questo sarebbe un bel po 'di lavoro.
I lavori di Philipp Haller su Capabilities for Uniqueness and Borrowing sono correlati a questo. C'è un sacco di altri lavori nel dominio dell'applicazione della "proprietà" attraverso il sistema dei tipi, ma Philipp in realtà fornisce un plugin utilizzabile al compilatore Scala.
- 1. Conversione da SLIM a HAML o ERB
- 2. Conversione da UTF-8 a ISO-8859-1 in Java
- 3. sulla conversione C++: nessuna conversione nota per argomento 1 da '[some_class]' a '[some_class] &'
- 4. Conversione da SQL Rank() a LINQ o alternativa
- 5. MySQL selezionare b'1' ritorna intero 1 o ASCII carattere 1 a seconda dell'ambiente
- 6. Conversione da C a MIPS
- 7. Conversione da esadecimale a stringa
- 8. Conversione da PDF a UIImage
- 9. Conversione da * Derivato a base * &
- 10. Conversione da ISBN10 a ISBN13
- 11. Conversione da Ruby a C#
- 12. Conversione da isom a mp42
- 13. Normalizzazione da [0.5 - 1] a [0 - 1]
- 14. Conversione da cinese a pinyin
- 15. Conversione da HBITMAP a Jpeg o Png in C++
- 16. Conversione da ppm a png
- 17. Conversione da Mercurial a Subversion
- 18. Conversione da HTML a XML
- 19. Conversione da CSV a array
- 20. Conversione da svg a jeff
- 21. Conversione da ArrayList a Collection
- 22. Conversione da RDD a LabeledPoint
- 23. Conversione da Bash shell a conversione binaria da
- 24. conversione da emf a jpg
- 25. In Javascript, perché [1, 2] == [1, 2] o ({a: 1}) == ({a: 1}) falso?
- 26. Conversione da BitArray a Byte
- 27. Conversione da IntWritatble a int
- 28. Conversione da Matlab a C++
- 29. Conversione da HTML a RTF
- 30. Conversione da EPS a Xaml
Sembra che questo sia un metodo 2.7. È commentato in 2.8.0-Beta1 e i documenti notturni non lo mostrano. – IttayD
sembra deprecato, usa 'collection.mutable.Map (1-> 2) .toMap' – Mermoz
Sfortunatamente,' toMap' copia le voci della mappa. Penso che stiamo cercando qualcosa che avvolga la mappa con un'interfaccia immutabile. – Mike