Rust中的'let x = x'是做什么的?


117

在野外看到了这段代码:

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

这条let fields = fields;线是做什么的?为什么在那儿?

Answers:


144

fields再次变得不可变。

fields以前定义为mutable(let mut fields = …;),用于sort_by_key就地排序并要求目标是可变的。作者在此处选择以明确防止进一步的可变性。

在Rust中,将可变绑定“降级”到不可变是很常见的。

执行此操作的另一种常见方法是使用块表达式:

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

44
还是“升级”,具体取决于您的观点。
Synesso

8
IMO的另一种编写方式是:可变变量的作用域是我们需要使用它的时间,然后将其移动。在语义上更好。
Boiethios

@DarthBoiethios一个或另一个对编译后的代码有什么改变吗?像添加其他无用的指令一样?还是允许编译器根据不变性假设进行更积极的优化?
iago-lito'考虑离开

1
@ iago-lito老实说,我不确定,但是我没有根据的猜测是它不会改变任何东西。
Boiethios

1
@ iago-lito 现在确实可以!但是,这被认为是错误,并且可能会在某个时间点修复。
mcarton

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.