null - 我们应该使用 Option 还是 ptr::null 来表示 Rust 中的空指针?
问题描述
标准库的链表Node
使用Option
类型:
struct Node<T> {
next: Option<NonNull<Node<T>>>,
prev: Option<NonNull<Node<T>>>,
element: T,
}
并使用以下代码创建一个节点:
Node {
next: None,
prev: None,
element,
}
的实现LeafNode
,BTree
标准库使用父节点的原始指针:
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
}
我们可以用C++来实现上面的代码,那么和表示空指针有nullptr
什么区别呢?表示空指针的推荐方法是什么?Option
std::ptr::null()
解决方案
一般来说,我建议使用NonNull<T>
over*const T
或*mut T
,Option
酌情使用来识别指针何时可能为空。
原因有两个:
- null 是否为有效值,在使用
NonNull
. *const T
并且*mut T
本质上是可以互换的,并且确实可以相互转换,因此const
或者mut
可能会提供一种错误的安全感。
的实现BTree
可能根本没有移植到NonNull
相对较新的 —— 它仅在 1.25 中稳定。
推荐阅读
- javascript - 动态替换功能
- node.js - 节点js REST服务错误将项目添加到数组
- javascript - 如何传递 html 表单?节点
- java - InputStream/Reader 未正确读取资产文件
- python - 如何在 Heroku 上的特定目录 (/app/assets/chromedriver) 中安装 chromedriver?
- sql - PL/SQL 从 JOIN 子句获取记录问题
- sql-server - 有没有办法保存 ssis 包/dtsx 文件中存在的所有查询?
- jquery - 在 Shiny 中使用本地语言文件进行 DataTables 国际化
- python - 当我运行“pip install something”时,pip 从哪里获取这个东西?
- simple-html-dom - file_get_html() 不适用于唯一的网页