标准库的链接列表Node
使用Option
类型:
struct Node<T> {
next: Option<NonNull<Node<T>>>,
prev: Option<NonNull<Node<T>>>,
element: T,
}
并使用以下代码创建一个节点:
Node {
next: None,
prev: None,
element,
}
BTree
LeafNode
的实现,标准库使用原始指针作为父节点:
struct LeafNode<K, V> {
parent: *const InternalNode<K, V>,
parent_idx: MaybeUninit<u16>,
len: u16,
keys: MaybeUninit<[K; CAPACITY]>,
vals: MaybeUninit<[V; CAPACITY]>,
}
并通过将parent
设置为 ptr::null
来创建新的叶节点:
LeafNode {
keys: MaybeUninit::uninitialized(),
vals: MaybeUninit::uninitialized(),
parent: ptr::null(),
parent_idx: MaybeUninit::uninitialized(),
len: 0
}
我们可以用nullptr
在C++中实现上面的代码,那么Option
和std::ptr::null()
来表示空指针有什么区别呢?表示空指针的推荐方法是什么?
一般来说,我建议使用 NonNull<T>
而不是 *const T
或 *mut T
,根据需要使用Option
来识别指针何时可能为空。
原因有二:
- null 是否为有效值将在使用
NonNull
时记录并强制执行。 -
*const T
和*mut T
基本上是可以互换的,而且确实可以相互叠加,因此const
或mut
可能会提供虚假的安全感。
BTree
的实现可能根本没有移植到 NonNull
中,这是相对较新的 - 它仅在 1.25 中稳定下来。