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?

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

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 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.