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í?

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
};

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.