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

时间:2019-01-15 08:55:46

标签: null rust idioms

标准库的链接列表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 ++中实现上述代码,因此nullptrOption代表空指针有什么区别?建议使用哪种方式表示空指针?

1 个答案:

答案 0 :(得分:7)

通常,我建议在NonNull<T>*const T上使用*mut T,并适当地使用Option来确定指针何时可能为空。

原因有两个:

  1. 使用NonNull时会记录是否为null或是否为有效值并强制执行
  2. *const T*mut T本质上是可互换的,并且确实可以相互转换,因此constmut可能会提供错误的安全感。

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