Esta questão está relacionada à pergunta feita aqui: Como declarar uma variável, mas não atribuí-la?
Meu problema é um pouco diferente. 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>
Erro:
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
Como posso corrigir isso?
Use a ferramenta certa para o trabalho, aqui seria
Iterator::find
, em vez de fazer um loop manualmente:Se a estrutura do seu código significa que o compilador não pode ter certeza de que seu valor foi inicializado, use
Option
:O
expect()
extrai o valor doOption
e entra em pânico com essa mensagem se ele nunca foi definido.A resposta para sua pergunta literal sobre como você pode fornecer ao compilador uma certa garantia que ele não pode provar por si só - é para isso que
unsafe {}
serve. Ele está literalmente dizendo ao compilador "Aqui está um código sobre o qual você não tem informações suficientes para dizer se é seguro ou não. Mas eu tenho essas informações e posso garantir que ele é realmente seguro!". Aqui, você pode usar umMaybeUninit
wrapper de tipo especial para emular o comportamento que você está pedindo:Aqui, você está literalmente dizendo ao compilador: "Suponha que a variável esteja inicializada". E como
MaybeUninit::assume_init()
é umaunsafe
função, você não tem escolha a não ser envolvê-la nounsafe {}
bloco para dizer ao compilador que você está fornecendo as garantias.(Você pode fazer algo parecido com o unsafe
Option::unwrap_unchecked
, se em vez disso você encapsular o valor emOption
).Link para o playground