我们应该使用Option还是ptr :: null来表示Rust中的空指针?

McG*_*ady 5 null idioms rust

标准库的链表Node 使用以下Option类型:

struct Node<T> {
    next: Option<NonNull<Node<T>>>,
    prev: Option<NonNull<Node<T>>>,
    element: T,
}
Run Code Online (Sandbox Code Playgroud)

并使用以下代码创建节点:

Node {
    next: None,
    prev: None,
    element,
}
Run Code Online (Sandbox Code Playgroud)

执行LeafNodeBTree,标准库使用父节点的原始指针:

struct LeafNode<K, V> {
    parent: *const InternalNode<K, V>,
    parent_idx: MaybeUninit<u16>,
    len: u16,
    keys: MaybeUninit<[K; CAPACITY]>,
    vals: MaybeUninit<[V; CAPACITY]>,
}
Run Code Online (Sandbox Code Playgroud)

通过设置parentptr::null:创建新的叶节点:

LeafNode {
    keys: MaybeUninit::uninitialized(),
    vals: MaybeUninit::uninitialized(),
    parent: ptr::null(),
    parent_idx: MaybeUninit::uninitialized(),
    len: 0
}
Run Code Online (Sandbox Code Playgroud)

我们可以使用nullptr以实现C++上面的代码,有啥之间的区别Option,并std::ptr::null()表示一个空指针?表示空指针的推荐方法是什么?

Mat*_* M. 7

一般情况下,我建议使用NonNull<T>over *const T*mut T使用Option适当的方法来识别指针何时为空.

原因有两方面:

  1. null是否为有效值,在使用时会记录并强制执行NonNull.
  2. *const T并且*mut T基本上是可互换的,并且实际上可以相互铸造,以便constmut可以提供虚假的安全感.

实施BTree可能根本没有移植到NonNull,这是相对较新的 - 它仅在1.25稳定.

  • NonNull 文档说:“如果您不确定是否应该使用 NonNull&lt;T&gt;,只需使用 *mut T!” (3认同)