O que 'let x = x' faz em Rust?

117

Eu vi este código à solta :

fields.sort_by_key(|&(_, ref field)| field.tags().into_iter().min().unwrap());
let fields = fields;

O que a let fields = fields;linha faz? Por que está aí?

Timthelion
fonte

Respostas:

144

Torna fieldsimutável novamente.

fieldsfoi definido anteriormente como mutable ( let mut fields = …;), para ser usado com o sort_by_keyqual classifica no local e requer que o destino seja mutável. O autor optou aqui por prevenir explicitamente mais mutabilidade.

"Desclassificar" uma ligação mutável para imutável é bastante comum em Rust.

Outra maneira comum de fazer isso é usar uma expressão de bloco:

let fields = {
    let mut fields =;
    fields.sort_by_key();
    fields
};
Mcarton
fonte
44
Ou "atualizando", dependendo da sua perspectiva.
Synesso de
8
IMO, sua outra maneira de escrever é a melhor: a variável mutável tem como escopo o tempo que precisamos para usá-la e, em seguida, ela é movida. É melhor semanticamente.
Boiethios
@DarthBoiethios Um ou outro altera alguma coisa no código compilado? Gosta de adicionar uma instrução adicional inútil? Ou permitindo otimizações mais agressivas pelo compilador com base em suposições de imutabilidade?
iago-lito 'considerando deixar
1
@ iago-lito Honestamente, não tenho certeza, mas meu palpite é que isso não muda nada.
Boiethios
1
@ iago-lito Agora sim! No entanto, isso é considerado um bug e provavelmente será corrigido em algum ponto.
mcarton
19

A declaração let var = var;torna-se varimutável e limitada ao seu valor atual. fieldsfoi declarado como mutantes.

Govind Parmar
fonte