llo*_*giq 11 initialization rust
在标准库中,文档显示了如何实例化MaybeUninits的数组
:
let arr: [MaybeUninit<T>; N] =
MaybeUninit::uninit().assume_init();
Run Code Online (Sandbox Code Playgroud)
我们知道这是安全的,因为的合同MaybeUninit允许使用未初始化的值。接下来,我们被要求ptr::write(value)用来初始化每个元素。但这unsafe又需要代码。我们还知道覆盖a MaybeUninit是安全的,因为它没有drop任何作用。那么,为什么不覆盖它arr[i] = MaybeUninit::new(value)呢?
let arr: [MaybeUninit<T>; N] = MaybeUninit::uninit().assume_init();只是一个捷径。
arr[i] = MaybeUninit::new(value),在你的例子中arr[i]是 aMaybeUninit所以你的问题只是关于使用什么样式来改变向量。您也可以这样做arr[i].write(value),这在实践中并没有真正改变,但每晚都需要,这就是为什么医生不使用它的原因。但是你是对的arr[i] = MaybeUninit::new(value),允许在没有不安全关键字的情况下覆盖该值,这是一个完美定义的行为。
你忘记的是,除了极少数情况外,Rust 并不需要它,它实际上并不是只MaybeUninit在 Rust 内部使用。我们主要在处理 ffi 时使用它,因此该示例并不是真正的单词用例。所以它看起来很奇怪。在这里,作者可能想模拟一个真实的情况,即使用原始指针在 Rust 外部初始化数组。
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |