Что делает let 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сортировки на месте и требует, чтобы цель была изменяемой. Автор решил здесь явно предотвратить дальнейшую изменчивость.

«Понижение» изменяемой привязки к неизменяемому довольно часто встречается в Rust.

Другой распространенный способ сделать это - использовать выражение блока:

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

44
Или «модернизация», в зависимости от вашей точки зрения.
Synesso

8
ИМО, ваш другой способ написать, что это путь: изменяемая переменная ограничивается временем, которое нам нужно для ее использования, а затем перемещается. Семантически лучше.
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.