2016-01-15 3 views
7

Функциональные структуры данных (такие как Hash Array Mapped Trie, используемые в Haskell/Clojure/Scala) полагаются на много общего в базовой структуре данных. Например, если мы реализуем insert по типу данных типа карты, который обычно реализуется путем копирования по пути на дереве, которое реализует структуру данных.Правильные ли правила заимствования Руста мешают функциональным структурам данных?

Учитывая, что эти структуры данных сильно зависят от общих (и не основных владельцев) базовых значений, будут ли заимствования мешать реализации таких структур?

+0

Как сформулировано, этот вопрос кажется слишком широким или основанным на мнениях. Вы что-то пробовали и не работали? Знаете ли вы, что «скрытый люк», который «небезопасно» обеспечивает? Какой ответ будет здесь действительным? Есть ли [hamt crate] (https://crates.io/crates/hamt/), это дает ответ? – Shepmaster

+3

См. Ответ на [этот вопрос] (https://stackoverflow.com/questions/31227269/generic-types-ownership-and-persistent-data-structures?rq=1). В нем объясняется, что «Rc» позволяет нескольким владельцам одних и тех же данных, и хотя он может выглядеть так: '.clone()' делает копию, это мелкая копия, которая фактически не копирует данные. На самом деле это неизменность, которая позволяет этому случиться. Ящик hamt использует 'Rc' [здесь] (https://github.com/rainbowbismuth/hamt-rs/blob/master/src/lib.rs#L801). –

+0

Совместное неизменное владение, как правило, просто, сделав GC явным. Циклические данные являются проблематичной частью. – Veedrac

ответ

8

Краткое сообщение: No.

Длинный ответ:

Ржавчина на самом деле очень хорошо работает с неизменяемыми структурами (это дает больше гарантий, чем Кассиопеяне const, например).

Совместное владение не представляет проблемы (Rc/Arc) с поистине неизменным значением, и вы можете легко брать много раз в неизменную структуру. Вы не можете двигаться во время заимствования, но это можно обойти, передав владельцам прокси (вместо Rc или Arc).

Одна проблема в Rust, которую вы можете не иметь в Haskell, смешивает измененные значения с помощью Cell или RefCell, так как вы можете создавать циклы, и они не будут собраны, потому что у Rust нет GC.