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

标签 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,
}

执行LeafNodeBTree , 标准库 uses a raw pointer for the parent node :

struct LeafNode<K, V> {
    parent: *const InternalNode<K, V>,
    parent_idx: MaybeUninit<u16>,
    len: u16,
    keys: MaybeUninit<[K; CAPACITY]>,
    vals: MaybeUninit<[V; CAPACITY]>,
}

并创建新的叶节点by setting parent to 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适本地识别指针何时可能为空。

原因有两个:

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

执行BTree可能根本没有移植到 NonNull ,这是相对较新的 -- 它仅在 1.25 中稳定下来。

关于null - 我们应该使用 Option 还是 ptr::null 来表示 Rust 中的空指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54195517/

相关文章:

Javascript IF 语句出现空条件错误

perl - 在Perl中解析一个由空字节分隔的字符串

python - 从嵌套字典中获取值

haskell - 这个 Haskell kata 解决方案可以变得更惯用吗?

c - 我的 fgets 实现像 fgets 一样读取实际内容,但如果在文件中找到 NULL 字符串,它会读取垃圾?

c# - IDictionary w/Null Key - MSDN 拼写错误或其他问题?

rust - Rust 中 f64 的最大值

recursion - 在递归枚举上使用附带移动值错误

json - 使用 actix_web 对部分结构进行 Serde 反序列化

reference - 传递可变引用总是比创建和返回拥有的值更可取吗?