在 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(),
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.
引入的
如何匹配枚举的值两次?
如果枚举的值在匹配中被“消耗”,问题似乎就会出现。 我不明白为什么我会收到错误消息“使用移动的值...移动后此处使用的值”——请参阅下面的代码
如果我 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(),
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.