2016-01-15 10 views
7

Struktury danych funkcjonalnych (takie jak odwzorowany tablica skrótów Trie używany w Haskell/Clojure/Scala) polegają na dzieleniu się dużą ilością danych w podstawowej strukturze danych. Na przykład, jeśli implementujemy insert na typie danych podobnym do mapy, który zwykle jest implementowany przez kopiowanie ścieżek w drzewie implementującym strukturę danych.Czy reguły pożyczkowe Rusta stają na drodze do funkcjonalnych struktur danych?

Biorąc pod uwagę, że te struktury danych polegają w dużej mierze na udostępnianiu (i brakowi właściciela) podstawowych wartości, czy zaciąganie pożyczek stanie na przeszkodzie wdrażaniu takich struktur?

+0

Tak sformułowane pytanie wydaje się zbyt szerokie lub oparte na opiniach. Czy próbowałeś czegoś i czy to nie działa? Czy znasz "luk bezpieczeństwa", który zapewnia "niebezpieczny"? Jaka odpowiedź byłaby ważna tutaj? Jest [skrzynia hamtowa] (https://crates.io/crates/hamt/), czy to stanowi odpowiedź? – Shepmaster

+3

Zobacz odpowiedź na [to pytanie] (https://stackoverflow.com/questions/31227269/generic-types-ownership-and-persistent-data-structures?rq=1). Wyjaśnia, że ​​'Rc' pozwala wielu właścicielom tych samych danych i chociaż może wyglądać jak' .clone() 'robi kopię, jest płytką kopią, która faktycznie nie kopiuje danych. Tak naprawdę to niezmienność pozwala na to. Skrzynia Hamt używa 'Rc' [tutaj] (https://github.com/rainbowbismuth/hamt-rs/blob/master/src/lib.rs#L801). –

+0

Współdzielone niezmienne własność jest generalnie proste dzięki wyraźnemu wyrażeniu GC. Cykliczne dane stanowią część problematyczną. – Veedrac

Odpowiedz

8

Krótka odpowiedź: nr.

Długi Odpowiedź:

Rust faktycznie działa bardzo dobrze ze struktur niezmienne (daje więcej gwarancji niż C na const na przykład).

Współwłasność nie stanowi problemu (Rc/Arc) o naprawdę niezmiennej wartości i można z łatwością pożyczyć wiele razy niezmienną strukturę. Nie możesz się poruszyć podczas pożyczania, ale można to obejść, rozdając własne serwery proxy (przez Rc lub Arc jeszcze raz) zamiast referencji.

Jedną z kwestii w Rust, której możesz nie mieć w Haskell, jest mieszanie zmiennych wartości z Cell lub RefCell, ponieważ możesz wtedy tworzyć cykle, które nie zostaną zebrane, ponieważ Rust nie ma GC.

Powiązane problemy