我遇到一个问题,我通过根据枚举的匹配来移动值来消耗枚举的内容。执行此操作后,我想返回该计算值以及仅基于枚举匹配的另一个值。但是,我收到错误
use of partially moved value: <variable name>
。我知道我可以将所有内容移至 1 个匹配语句中,但在我更复杂的情况下,这并不那么干净。
这是我的问题的最小可重现示例。我想做这样的事情:
enum hand {
two_pair(String, String),
three_of_a_kind(String),
}
fn print_hand(hand: hand) {
let value = match hand {
hand::two_pair(a, b) => a.parse::<i32>().unwrap() + b.parse::<i32>().unwrap(),
hand::three_of_a_kind(a) => a.parse::<i32>().unwrap(),
};
match hand {
hand::two_pair(_, _) => println!("Two pair: {}", value),
hand::three_of_a_kind(_) => println!("Three of a kind: {}", value),
}
}
但是为了让它现在真正发挥作用,我必须这样做:
fn print_hand_ugly(hand: hand) {
match hand {
hand::two_pair(a, b) => {
let value = a.parse::<i32>().unwrap() + b.parse::<i32>().unwrap();
println!("Two pair: {}", value);
}
hand::three_of_a_kind(a) => {
let value = a.parse::<i32>().unwrap();
println!("Three of a kind: {}", value);
}
}
}
任何帮助或提示将不胜感激。在我的情况下复制该值是不可能的,移动是首选情况。 Rust Playground 中的 MRE
你可以这样做:
enum hand {
two_pair(String, String),
three_of_a_kind(String),
}
fn print_hand(hand: hand) {
let value = match &hand {
hand::two_pair(a, b) => a.parse::<i32>().unwrap() + b.parse::<i32>().unwrap(),
hand::three_of_a_kind(a) => a.parse::<i32>().unwrap(),
};
match hand {
hand::two_pair(_, _) => println!("Two pair: {}", value),
hand::three_of_a_kind(_) => println!("Three of a kind: {}", value),
}
}
这可以编译,因为 match 使用
&Hand
而不是消耗值本身。在您的原始示例中,匹配语句消耗并接管了 hand
,因此它不再可供该值之后的任何内容使用。