函数式数据结构(如Haskell/Clojure/Scala中使用的哈希数组映射树)依赖于底层数据结构中的大量共享。例如,如果我们在一个类似于映射的数据类型上实现insert,那么通常是通过对实现数据结构的树进行路径复制来实现的。 考虑到这些数据结构非常依赖于共享(且没有主要所有者),那么借用会妨碍实现这些数据结构吗?
简短回答: 不行。 详细回答: Rust与不可变结构非常配合(它比C的const提供更多的保证)。 共享所有权没有问题(Rc/ Arc),对于真正的不可变值,您可以轻松地借用多次到不可变结构中。在借用时无法移动,但这可以通过分发拥有代理(再次使用Rc或Arc)而不是引用来规避。 Rust中的一个问题是,如果将可变值与Cell或RefCell混合使用,则可能会创建循环,并且这些循环将不被收集,因为Rust没有GC。
unsafe
提供的“逃生口”?在这里什么样的回答才是有效的?有一个hamt crate,它提供了一个答案吗? - ShepmasterRc
允许多个所有者拥有相同的数据,虽然.clone()
看起来像是在复制数据,但实际上它是浅层复制,不会真正复制数据。其实是不可变性使得这种情况成为可能。在此处,hamt crate使用了Rc
这里。 - Alex Knauth