这个问题与这里提出的问题有关:如何声明一个变量但不分配它?
我的问题略有不同。MRE:
let var: MyGenericType;
for value in vec_of_values_of_my_generic_type {
// one of the values is mathematically guaranteed to meet this condition because the vector is special
if <value meets a certain condition> {
var = value;
}
}
<use var>
错误:
error[E0381]: used binding `var` is possibly-uninitialized
--> example/src/lib.rs:127:23
|
120 | let var: MyGenericType;
| -- binding declared here but left uninitialized
...
123 | var = value;
| -- binding initialized here in some conditions
...
127 | foo(var);
| ^^ `var` used here but it is possibly-uninitialized
我该如何修复这个问题?
使用正确的工具来完成工作,这里就是
Iterator::find
,而不是手动循环:如果你的代码结构意味着编译器不能确定你的值是否被初始化,请使用
Option
:如果从未设置过,则会
expect()
从中提取值并发出该消息以引发恐慌。Option
回答你关于如何为编译器提供某种它自己无法证明的保证的问题-这就是它的目的。它实际上是告诉编译器“这里有一些代码,你没有足够的信息来判断它是否安全。但我有这些信息,可以向你保证它确实是安全的!”。在这里,你可以使用特殊类型的包装器来模拟你要求的行为:
unsafe {}
MaybeUninit
在这里,您实际上是在告诉编译器:“假设变量已初始化”。由于
MaybeUninit::assume_init()
是一个unsafe
函数,因此您别无选择,只能将其包装在unsafe {}
块中以告诉编译器您正在提供保证。Option::unwrap_unchecked
(如果您将值包装到 中,则可以对 unsafe 做类似的事情Option
)。游乐场链接