2016-01-15 12 views
7

Le strutture dati funzionali (come il Trie Hash Array Mapped utilizzato in Haskell/Clojure/Scala) si basano su molte condivisioni nella struttura dati sottostante. Ad esempio, se implementiamo insert su un tipo di dati simile a una mappa che di solito viene implementato copiando il percorso sull'albero che implementa la struttura dati.Le regole sul prestito di Rust intralciano le strutture funzionali dei dati?

Dato che queste strutture di dati si basano molto sulla condivisione (e nessun proprietario principale di) valori sottostanti, i prestiti prenderanno il modo di implementare tali strutture?

+0

Come detto, questa domanda sembra troppo ampia o basata sull'opinione pubblica. Hai provato qualcosa e non ha funzionato? Sei a conoscenza del "portello di fuga" che fornisce "non sicuro"? Che tipo di risposta sarebbe valida qui? C'è una [hamt crate] (https://crates.io/crates/hamt/), fornisce una risposta? – Shepmaster

+3

Vedere la risposta a [questa domanda] (https://stackoverflow.com/questions/31227269/generic-types-ownership-and-persistent-data-structures?rq=1). Spiega che 'Rc' consente a più proprietari degli stessi dati, e mentre potrebbe sembrare' .clone() 'fa una copia, è una copia superficiale che in realtà non copia i dati. In realtà è l'immutabilità che permette che ciò accada. La cassa hamt usa 'Rc' [qui] (https://github.com/rainbowbismuth/hamt-rs/blob/master/src/lib.rs#L801). –

+0

La proprietà condivisa e immutabile è in genere semplice rendendo esplicito GC. I dati ciclici sono la parte problematica. – Veedrac

risposta

8

Risposta breve: No.

lungo Risposta:

Rust effettivamente funziona molto bene con le strutture immutabili (che dà maggiori garanzie rispetto a C di const per esempio).

La proprietà condivisa non è un problema (Rc/Arc) con un valore veramente immutabile e si può facilmente prendere in prestito più volte in una struttura immutabile. Non è possibile spostarsi mentre si prende in prestito, ma questo può essere aggirato distribuendo i propri proxy (tramite Rc o Arc ancora una volta) anziché i riferimenti.

L'unico problema in Rust che potresti non avere in Haskell è quello di mescolare i valori mutabili con Cell o RefCell come puoi quindi creare cicli e quelli non verranno raccolti perché Rust non ha GC.

Problemi correlati