标准库的链接列表Node
uses the Option
type:
struct Node<T> {
next: Option<NonNull<Node<T>>>,
prev: Option<NonNull<Node<T>>>,
element: T,
}
并使用以下代码创建节点:
Node {
next: None,
prev: None,
element,
}
LeafNode
的{{1}},标准库uses a raw pointer for the parent node的实现:
BTree
并创建新的叶节点by setting parent
to ptr::null
:
struct LeafNode<K, V> {
parent: *const InternalNode<K, V>,
parent_idx: MaybeUninit<u16>,
len: u16,
keys: MaybeUninit<[K; CAPACITY]>,
vals: MaybeUninit<[V; CAPACITY]>,
}
我们可以使用LeafNode {
keys: MaybeUninit::uninitialized(),
vals: MaybeUninit::uninitialized(),
parent: ptr::null(),
parent_idx: MaybeUninit::uninitialized(),
len: 0
}
在C ++中实现上述代码,因此nullptr
和Option
代表空指针有什么区别?建议使用哪种方式表示空指针?
答案 0 :(得分:7)
通常,我建议在NonNull<T>
或*const T
上使用*mut T
,并适当地使用Option
来确定指针何时可能为空。
原因有两个:
NonNull
时会记录是否为null或是否为有效值并强制执行 。*const T
和*mut T
本质上是可互换的,并且确实可以相互转换,因此const
或mut
可能会提供错误的安全感。 BTree
的实现可能根本没有移植到NonNull
,这是相对较新的-它仅稳定在1.25。