Co robi 'let x = x' w Rust?

117

Widziałem ten kod na wolności :

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

Co robi let fields = fields;linia? Dlaczego tam jest?

timthelion
źródło

Odpowiedzi:

144

fieldsZnowu czyni niezmiennym.

fieldszostał wcześniej zdefiniowany jako mutable ( let mut fields = …;), do użycia z sort_by_keyktórym sortuje w miejscu i wymaga, aby cel był mutowalny. Autor zdecydował się tutaj wyraźnie zapobiec dalszej zmienności.

„Obniżenie” zmiennego powiązania na niezmienne jest dość powszechne w Rust.

Innym powszechnym sposobem na to jest użycie wyrażenia blokowego:

let fields = {
    let mut fields =;
    fields.sort_by_key();
    fields
};
mcarton
źródło
44
Lub „ulepszanie”, w zależności od twojej perspektywy.
Synesso
8
IMO Twój inny sposób na napisanie, który jest właściwy: zmienna zmienna jest objęta zakresem czasu potrzebnym do jej użycia, a następnie jest przenoszona. Jest lepiej semantycznie.
Boiethios
@DarthBoiethios Czy któryś z nich zmienia coś w skompilowanym kodzie? Chcesz dodać dodatkową, bezużyteczną instrukcję? A może włączenie bardziej agresywnych optymalizacji przez kompilator w oparciu o założenia niezmienności?
iago-lito 'rozważa wyjazd
1
@ iago-lito Szczerze mówiąc, nie jestem pewien, ale moje niewykształcone przypuszczenie jest takie, że to niczego nie zmienia.
Boiethios
1
@ iago-lito Teraz faktycznie tak jest! Jednak jest to uważane za błąd i prawdopodobnie zostanie naprawiony w pewnym momencie.
mcarton
19

Instrukcja let var = var;czyni varniezmienną i powiązaną z jej bieżącą wartością. fieldszostał zadeklarowany jak mutwcześniej.

Govind Parmar
źródło