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?

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.