在 Rust 中匹配和使用枚举两次不起作用

Match and consume enum in Rust two times does not work

如何匹配枚举的值两次?

如果枚举的值在匹配中被“消耗”,问题似乎就会出现。 我不明白为什么我会收到错误消息“使用移动的值...移动后此处使用的值”——请参阅下面的代码

如果我 return 只是值,我会理解得到错误,但我 return 克隆值但仍然得到错误。

// Here a simple enum
enum SomeEnum {
    X(String),
}

// Then later in some function ...

// Test Enum which works
let x = SomeEnum::X(String::from(("a")));

let x_val1 = match x {
    SomeEnum::X(_) => 1
};
println!("x_val1 = {}", x_val1);

let x_val2 = match x {
    SomeEnum::X(_) => 1
};
println!("x_val2 = {}", x_val2);

// Test Enum which does not work
let y = SomeEnum::X(String::from(("b")));

let y_val1 = match y {
    SomeEnum::X(value) => value.clone()
};
println!("y_val1 = {}", y_val1);

// Does not compile, here I get error message ...
// use of moved value
//
// value used here after move
let y_val2 = match y {
    SomeEnum::X(value) => value.clone()
};
println!("y_val2 = {}", y_val2);

默认情况下,match 语句会消耗所有可能的数据,因此该值将被移动和拥有。 编译器已经提出了解决方法:

help: borrow this field in the pattern to avoid moving y.0
SomeEnum::X(ref value) => value.clone(),

keyword ref:

Using the ref keyword, the value is only borrowed, not moved, making it available for use after the match statement:

您目前所做的是让 match 获得所有权,然后进行克隆。但在那一点上,所有权已经“消失”了。所以编译器会抱怨它。

但是在今天的 Rust 中你甚至可以让它变得更简单。如果您匹配借用的值 match &y,则所有绑定也将尝试借用。 这是用 match ergonomics.

引入的