Cosa fa 'let x = x' in Rust?


117

Ho visto questo codice in natura :

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

Cosa fa la let fields = fields;linea? Perché c'è?

Risposte:


144

Rende di fieldsnuovo immutabile.

fieldsera precedentemente definito come mutable ( let mut fields = …;), da utilizzare con il sort_by_keyquale ordina sul posto e richiede che il target sia mutabile. L'autore ha scelto qui di impedire esplicitamente un'ulteriore mutabilità.

Il "downgrade" di un'associazione mutabile a immutabile è abbastanza comune in Rust.

Un altro modo comune per farlo è usare un'espressione di blocco:

let fields = {
    let mut fields =;
    fields.sort_by_key();
    fields
};

44
O "aggiornamento", a seconda della prospettiva.
Synesso

8
IMO è un altro modo di scrivere che è la strada da percorrere: la variabile mutabile ha l'ambito del tempo necessario per usarla, e quindi viene spostata. È meglio semanticamente.
Boiethios

@DarthBoiethios L'uno o l'altro cambia qualcosa al codice compilato? Come aggiungere un'istruzione aggiuntiva e inutile? O consentire ottimizzazioni più aggressive da parte del compilatore basate su presupposti di immutabilità?
iago-lito 'considerando di lasciare il

1
@ iago-lito Onestamente, non ne sono sicuro, ma la mia ipotesi non istruita è che non cambia nulla.
Boiethios

1
@ iago-lito In questo momento lo fa davvero! Tuttavia, questo è considerato un bug e probabilmente verrà risolto prima o poi.
mcarton

19

L'istruzione let var = var;rende varimmutabile e vincolata al suo valore corrente. fieldsè stato dichiarato come mutprima.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.