Що робить "нехай x = x" у Rust?


117

Я бачив цей код у дикій природі :

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

Що робить let fields = fields;лінія? Чому саме там?

Відповіді:


144

Це fieldsзнову робить непорушним.

fieldsраніше був визначений як mutable ( let mut fields = …;), який слід використовувати, за допомогою sort_by_keyякого сортується на місці і вимагає змінити ціль. Автор вирішив тут чітко запобігти подальшій незмінності.

"Пониження" змінного зв'язування на незмінне досить поширене у Русті.

Ще один поширений спосіб зробити це - використання виразу блоку:

let fields = {
    let mut fields =;
    fields.sort_by_key();
    fields
};

44
Або "модернізація", залежно від вашої точки зору.
Синесо

8
IMO - ваш інший спосіб написання, що це шлях: змінна змінна визначає час, який нам потрібно використовувати, і потім вона переміщується. Краще семантично.
Boiethios

@DarthBoiethios Чи змінить той чи інший щось у складеному коді? Як додати додаткову, марну інструкцію? Або включення більш агресивних оптимізацій компілятором на основі припущень про незмінність?
iago-lito 'розглядаючи можливість виїзду

1
@ iago-lito Чесно кажучи, я не впевнений, але моя неосвічена здогадка полягає в тому, що це нічого не змінить.
Boiethios

1
@ iago-lito Зараз це насправді так! Однак це вважається помилкою і, ймовірно, виправиться в якийсь момент.
mcarton

19

Заява let var = var;робить varнепорушною і прив'язується до її поточного значення. fieldsбуло оголошено як mutраніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.