struct List<T>{
head:Pointer<T>,
tail:Pointer<T>
}
struct Node<T>{
element:T,
next:Pointer<T>,
prev:Pointer<T>,
}
// you need multiple owners who can mutate the data
// type is option because last_node.next will be Null
type Pointer<T>=Option<Rc<RefCell<Node<T>>>>;
3条答案
按热度按时间3phpmpom1#
Rust并不是实现链表的理想语言。在设计上没有唯一的所有权,所以Rust的类型系统会有一点困难。
我想这更像是一个学习的东西,而不是一些富有成效的东西,在这种情况下,你应该考虑链表的替代品。
你可以使用
Rc<Cell<Node>>
来实现。Rc
允许您通过引用计数来拥有多个所有者。Cell
允许您更改Node,即使存在活动引用。mv1qrgav2#
的数据
Rust所有权规则规定,每个值一次只能有一个所有者。但在双向链表中,每个节点将有两个所有者。我们使用Rc smart pointer
字符串
为了支持多重所有权,Rust有一个名为Rc的类型。它的名字是引用计数的缩写,它跟踪对某个值的引用数量,以了解该值是否仍在使用。如果对某个值的引用为零,则可以清除该值,而不会使任何引用变为无效。
但问题是Rc指针所拥有的值是不可变的。它是只读。您可能需要修改每个节点。这就是为什么您需要使用
RefCell
型
也就是说,你可以在Rust中使用struct创建一个双向链表。
型
1sbrub3j3#
有一个关于如何做https://rust-unofficial.github.io/too-many-lists/sixth-final.html的链接
它使用
unsafe
,但unsafe
是必需的,因为安全版本https://rust-unofficial.github.io/too-many-lists/fourth-final.html使用RefCell
,这增加了运行时检查,并且不能像unsafe
版本那样性能好。请注意,我们可以避免运行时检查,因为我们可以证明unsafe
代码的安全性,并且对于API消费者来说,所有公共方法都是安全的。一般来说,当Rust的安全特性阻止你做某些事情时,使用
unsafe
特性并编写Rust代码~相同(与射击你的腿相同,就像在C中一样,但性能与C一样)作为C++。这样,当静态分析器可以帮助您自动执行安全检查时,您将拥有尽可能安全的代码(比任何其他编程语言都安全,包括垃圾收集的代码),当静态分析器不足以处理某些情况时,您的代码与C中的代码相同(与C中的相同,但与C++中的性能相同)