2016-01-15 15 views
7

Cấu trúc dữ liệu chức năng (chẳng hạn như Hash Array Mapped Trie được sử dụng trong Haskell/Clojure/Scala) dựa vào nhiều chia sẻ trong cấu trúc dữ liệu cơ bản. Ví dụ: nếu chúng tôi triển khai insert trên loại dữ liệu giống như bản đồ thường được triển khai bằng cách sao chép đường dẫn trên cây triển khai cấu trúc dữ liệu.Quy tắc vay của Do Rust có cản trở các cấu trúc dữ liệu chức năng không?

Cho rằng các cấu trúc dữ liệu này phụ thuộc rất nhiều vào việc chia sẻ (và không có chủ sở hữu chính) các giá trị cơ bản, sẽ vay theo cách thực hiện các cấu trúc như vậy?

+0

Như đã nói, câu hỏi này có vẻ quá rộng hoặc dựa trên ý kiến. Bạn đã thử một cái gì đó và nó đã không hoạt động? Bạn có biết về "lối thoát" mà 'không an toàn' cung cấp không? Câu trả lời nào sẽ hợp lệ ở đây? Có một thùng [hamt] (https://crates.io/crates/hamt/), điều đó có cung cấp câu trả lời không? – Shepmaster

+3

Xem câu trả lời cho [câu hỏi này] (https://stackoverflow.com/questions/31227269/generic-types-ownership-and-persistent-data-structures?rq=1). Nó giải thích rằng 'Rc' cho phép nhiều chủ sở hữu của cùng một dữ liệu, và trong khi nó có thể giống như' .clone() 'thực hiện một bản sao, đó là một bản sao nông không thực sự sao chép dữ liệu. Nó thực sự bất biến cho phép điều này xảy ra. Thùng hamster sử dụng 'Rc' [ở đây] (https://github.com/rainbowbismuth/hamt-rs/blob/master/src/lib.rs#L801). –

+0

Quyền sở hữu không thể chia sẻ chung thường đơn giản bằng cách làm cho GC rõ ràng. Dữ liệu tuần hoàn là một phần có vấn đề. – Veedrac

Trả lời

8

Trả lời ngắn: Không.

dài trả lời:

Rust thực sự hoạt động rất tốt với các cấu trúc bất biến (nó mang lại đảm bảo hơn C const ví dụ).

Quyền sở hữu chung không có vấn đề (Rc/Arc) với giá trị thực sự không thay đổi và bạn có thể dễ dàng vay nhiều lần vào cấu trúc không thay đổi. Bạn không thể di chuyển trong khi vay, nhưng điều này có thể được phá vỡ bằng cách trao quyền sở hữu proxy (thông qua Rc hoặc Arc một lần nữa) thay vì tham chiếu.

Vấn đề duy nhất trong Rust mà bạn có thể không có trong Haskell là trộn các giá trị có thể thay đổi với Cell hoặc RefCell khi bạn có thể tạo chu kỳ và những chu kỳ đó sẽ không được thu thập vì Rust không có GC.

Các vấn đề liên quan