Que fait 'let x = x' dans Rust?

117

J'ai vu ce code dans la nature :

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

Que fait la let fields = fields;ligne? Pourquoi est-ce là?

timthelion
la source

Réponses:

144

Cela rend à fieldsnouveau immuable.

fieldsa été précédemment défini comme mutable ( let mut fields = …;), à utiliser avec sort_by_keyquels types de tri sur place et nécessite que la cible soit mutable. L'auteur a choisi ici d'empêcher explicitement une mutabilité supplémentaire.

"Rétrograder" une liaison mutable en immuable est assez courant dans Rust.

Une autre façon courante de procéder consiste à utiliser une expression de bloc:

let fields = {
    let mut fields =;
    fields.sort_by_key();
    fields
};
mcarton
la source
44
Ou «mise à niveau», selon votre point de vue.
Synesso
8
IMO, votre autre façon d'écrire est la voie à suivre: la variable mutable est limitée au temps dont nous avons besoin pour l'utiliser, puis elle est déplacée. C'est mieux sémantiquement.
Boiethios
@DarthBoiethios Est-ce que l'un ou l'autre change quelque chose au code compilé? Vous aimez ajouter une instruction supplémentaire inutile? Ou permettre des optimisations plus agressives par le compilateur basées sur des hypothèses d'immuabilité?
iago-lito 'envisage de quitter le
1
@ iago-lito Honnêtement, je ne suis pas sûr, mais je suppose que cela ne change rien.
Boiethios
1
@ iago-lito En ce moment, c'est le cas! Cependant, ceci est considéré comme un bogue et sera probablement corrigé à un moment donné.
mcarton
19

La déclaration let var = var;rend varimmuable et liée à sa valeur actuelle. fieldsa été déclaré comme mutprécédemment.

Govind Parmar
la source