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.