Was macht 'lass x = x' in Rust?

117

Ich habe diesen Code in freier Wildbahn gesehen :

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

Was macht die let fields = fields;Leitung? Warum ist es dort?

Timthelion
quelle

Antworten:

144

Es macht fieldswieder unveränderlich.

fieldswurde zuvor als veränderlich ( let mut fields = …;) definiert, um verwendet zu werden, mit sort_by_keywelchen Sortierungen an Ort und Stelle und erfordert, dass das Ziel veränderlich ist. Der Autor hat sich hier entschieden, eine weitere Veränderlichkeit ausdrücklich zu verhindern.

Das "Herabstufen" einer veränderlichen Bindung an unveränderliche ist in Rust durchaus üblich.

Ein anderer üblicher Weg, dies zu tun, ist die Verwendung eines Blockausdrucks:

let fields = {
    let mut fields =;
    fields.sort_by_key();
    fields
};
mcarton
quelle
44
Oder "Upgrade", je nach Ihrer Perspektive.
Synesso
8
IMO ist Ihre andere Art zu schreiben, die der richtige Weg ist: Die veränderbare Variable hat den Zeitrahmen, den wir für ihre Verwendung benötigen, und wird dann verschoben. Es ist semantisch besser.
Boiethios
@DarthBoiethios Ändert der eine oder andere etwas an kompiliertem Code? Möchten Sie eine zusätzliche, nutzlose Anweisung hinzufügen? Oder aggressivere Optimierungen durch den Compiler basierend auf Unveränderlichkeitsannahmen ermöglichen?
iago-lito 'erwägt, den
1
@ iago-lito Ehrlich gesagt bin ich mir nicht sicher, aber meine ungebildete Vermutung ist, dass sich daran nichts ändert.
Boiethios
1
@ iago-lito Im Moment ist es tatsächlich so! Dies wird jedoch als Fehler angesehen und wahrscheinlich irgendwann behoben.
Mcarton
19

Die Aussage let var = var;macht varunveränderlich und an ihren aktuellen Wert gebunden. fieldswurde wie mutfrüher deklariert .

Govind Parmar
quelle