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::
的情况进行对比,后者不允许使用索引。这种类似的情况可能是文档以这种方式编写的原因。