我正在尝试对Vec
个枚举进行排序。请忽略排序机制本身,这只是一个简化的例子。
use std::cmp::Ordering;
enum MyEnum {
Option1,
Option2,
}
fn main() {
let mut my_list: Vec<MyEnum> = vec![MyEnum::Option1, MyEnum::Option2, MyEnum::Option1];
// (1) - doesn't work
my_list.sort_unstable_by(|a, b| match (*a, *b) {
(MyEnum::Option1, MyEnum::Option1) => Ordering::Equal,
(MyEnum::Option1, MyEnum::Option2) => Ordering::Less,
_ => Ordering::Greater
});
}
我收到以下错误:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:12:44
|
12 | my_list.sort_unstable_by(|a, b| match (*a, *b) {
| ^^ cannot move out of borrowed content
以下两种变体有效:
// (2)
my_list.sort_unstable_by(|a, _b| match *a {
MyEnum::Option1 => Ordering::Less,
MyEnum::Option2 => Ordering::Greater
});
// (3)
my_list.sort_unstable_by(|a, b| match (a, b) {
(&MyEnum::Option1, &MyEnum::Option1) => Ordering::Equal,
(&MyEnum::Option1, &MyEnum::Option2) => Ordering::Less,
_ => Ordering::Greater
});
当我想匹配一个简单的引用时,我可以取消引用它(变体2);为什么这在变体1的元组中不起作用?
我理解为什么3个有效,但很难理解1中的移动恰好发生在哪里以及如何以不同方式进行。
答案 0 :(得分:2)
确切地发生了一次移动
在编译器指向的位置发生移动 - *a
。您正在将a
的内容移动到一个全新的元组中。你不能这样做,所以编译器会出错。
&#34; dereference&#34;没有真正解除引用的匹配变量是编译器提供的一些语法上的好处,但它非常有限。它没有&#34;进入&#34;表达式,它只查看一些select语法结构,并且知道忽略它们。
可能可以增强编译器以查看这些情况,但可能在这个时间点,成本/收益权衡并不是有利的。
另见: