Rust 为什么将`ptr::write`与`maybeuniit`的数组一起使用?
在标准库中,显示了如何实例化Rust 为什么将`ptr::write`与`maybeuniit`的数组一起使用?,rust,initialization,Rust,Initialization,在标准库中,显示了如何实例化 maybeinits: let arr: [MaybeUninit<T>; N] = MaybeUninit::uninit().assume_init(); let arr:[maybeuniit;N]= 可能是uninit::uninit(); 我们知道这是安全的,因为maybeuniit的契约允许未初始化的值。接下来,我们需要使用ptr::write(value)来初始化每个元素。但这需要再次使用不安全的代码。我们还知道,覆盖可能会取消
maybeinit
s:
let arr: [MaybeUninit<T>; N] =
MaybeUninit::uninit().assume_init();
let arr:[maybeuniit;N]=
可能是uninit::uninit();
我们知道这是安全的,因为
maybeuniit
的契约允许未初始化的值。接下来,我们需要使用ptr::write(value)
来初始化每个元素。但这需要再次使用不安全的代码。我们还知道,覆盖可能会取消它
是安全的,因为它不会删除任何内容。那么,为什么不直接覆盖它,比如arr[i]=MaybeUninit::new(value)
?让arr:[MaybeUninit;N]=MaybeUninit::uninit()代码>只是一个快捷方式
arr[i]=MaybeUninit::new(value)
,在您的示例中,arr[i]
是一个MaybeUninit
,所以您的问题只是关于使用什么样式来变异向量。你也可以做arr[i].write(value)
,这在实践中并没有真正改变,但这就是为什么文档不使用它的原因。但是您是对的arr[i]=maybeuniit::new(value)
允许在不使用不安全关键字的情况下覆盖该值,这是一种定义完美的行为
你忘记的是,maybeinit
实际上不是用来的,只是内部生锈,除了极少数情况,生锈不需要它。我们在处理ffi时通常使用它,所以这个例子并不是一个真正的单词用例。所以它看起来很奇怪。在这里,作者可能想模拟一个真实的word案例,其中数组将通过使用原始指针在Rust外部初始化。我不同意Maybeuniit“在Rust内部不真正使用”。在编写自定义数据结构时,它可能非常有用。实际上,您没有回答我的问题:这是已定义的行为吗?如果您使用类似于maybeunit:::uninit()
的东西,您应该小心使用索引,因为它将创建对未初始化的bool
的隐式引用,这是未定义的行为。但是,当数组的所有项都是selves时,可能会取消它
,这不应该是一个问题,所以我相信索引是安全的。你试过了吗?是的,我试过了,这给了我一些信心。但是我的用例有一个泛型类型,我不能检查所有可能的实际类型。我还使用了maybeuniit:::uninit()。假设是_init(),而不是maybeuniit`。我知道您使用的是什么类型。我试图将您的代码与使用maybeunit::
的情况进行对比,后者不允许使用索引。这种类似的情况可能是文档以这种方式编写的原因。