Rust 为什么取消引用的元组上的匹配不起作用,而取消引用的非元组却起作用?
我正在尝试对枚举的Rust 为什么取消引用的元组上的匹配不起作用,而取消引用的非元组却起作用?,rust,tuples,match,Rust,Tuples,Match,我正在尝试对枚举的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_
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
});
}
以下两种变体可以工作:
// (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中到底发生了什么,以及如何做得不同
确切的移动发生在哪里
当编译器指向-*A
时会发生移动。您正在将a
的内容移动到一个全新的元组中。您不能这样做,因此编译器会给出一个错误
编译器提供了一些语法上的优点,可以“去引用”匹配的变量,而不必真正去引用它,但这是非常有限的。它没有“查看”表达式,它只查看一些选择的语法结构,知道如何忽略它们
编译器可能会得到增强以查看这些情况,但此时成本/收益权衡可能并不有利
另见:
#[派生(克隆,复制)]
。这使枚举成为一种副本类型,因此您可以从中移出,而原始枚举仍然有效。