在Rust中,'let x = x' 是什么意思?

136

我在外面看到了这段代码 in the wild

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

let fields = fields; 这一行代码是做什么用的?它为什么会在那里?

2个回答

176

它使得fields变得再次不可变。

fields之前被定义为可变的(let mut fields = …;),以便与sort_by_key一起使用,该函数对目标进行就地排序并需要目标是可变的。作者在此选择明确防止进一步的可变性。

在Rust中,“降级”可变绑定为不可变是非常常见的。

另一种常见的方法是使用块表达式:

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

53
或者,根据您的观点,“升级”。 - Synesso
10
我认为你提出的另一种写法更好:可变变量在我们需要使用它的时候被限定在作用域内,之后就会被移动。从语义上讲,这更好。 - Boiethios
1
@iago-lito 说实话,我不确定,但我的无知猜测是它不会改变任何东西。 - Boiethios
1
@iago-lito 现在它实际上是这样的! 然而,这被认为是一个错误,并且很可能会在某个时候得到修复。 - mcarton
2
@iago-lito 该问题的最新评论表明,现在这两个示例生成的代码是相同的。 - mcarton
显示剩余2条评论

20

语句 let var = var; 使得变量 var 变成不可变,并绑定到它当前的值。变量 fields 在之前被声明为 mut


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接