Что делает let x = x в Rust?

117

Я видел этот код в дикой природе :

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

Что делает let fields = fields;линия? Почему это там?

timthelion
источник

Ответы:

144

Он fieldsснова делает неизменным.

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

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

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

let fields = {
    let mut fields =;
    fields.sort_by_key();
    fields
};
mcarton
источник
44
Или «модернизация», в зависимости от вашей точки зрения.
Synesso
8
ИМО, ваш другой способ написать, что это путь: изменяемая переменная ограничивается временем, которое нам нужно для ее использования, а затем перемещается. Семантически лучше.
Boiethios
@DarthBoiethios Что-нибудь меняет в скомпилированном коде? Как добавить дополнительную, бесполезную инструкцию? Или включение более агрессивной оптимизации компилятором на основе предположений неизменности?
iago-lito 'рассматривает возможность отъезда
1
@ iago-lito Честно говоря, я не уверен, но, по моему необразованному мнению, это ничего не меняет.
Boiethios
1
@ iago-lito Сейчас это действительно так! Однако это считается ошибкой и, вероятно, когда-нибудь будет исправлено.
mcarton
19

Оператор let var = var;делает varнеизменным и привязанным к его текущему значению. fieldsбыло заявлено как mutраньше.

Говинд Пармар
источник