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
的内容移动到一个全新的元组中。您不能这样做,因此编译器会给出一个错误

编译器提供了一些语法上的优点,可以“去引用”匹配的变量,而不必真正去引用它,但这是非常有限的。它没有“查看”表达式,它只查看一些选择的语法结构,知道如何忽略它们

编译器可能会得到增强以查看这些情况,但此时成本/收益权衡可能并不有利

另见:


啊,好的。。。谢谢这些链接,我在发布问题之前没有找到它们,但特别是第一个问题已经回答了我的问题。@mrspl如果回答了你的问题,那么我可以将这个问题标记为该问题的副本,但你必须先不接受答案,然后我才能删除它。我不确定它是否真的是另一个问题的副本。只有你给出的答案的第二部分碰巧也回答了我的问题,尽管这并不是在另一个线程中明确提出的问题。您认为我还是应该将其标记为重复项还是像这样保留?这并不能回答您的问题,但解决此问题的一种方法是在枚举上添加
#[派生(克隆,复制)]
。这使枚举成为一种副本类型,因此您可以从中移出,而原始枚举仍然有效。