匹配部分移动的枚举 Rust

问题描述 投票:0回答:1

我遇到一个问题,我通过根据枚举的匹配来移动值来消耗枚举的内容。执行此操作后,我想返回该计算值以及仅基于枚举匹配的另一个值。但是,我收到错误

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

rust enums match borrow-checker
1个回答
0
投票

你可以这样做:

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
,因此它不再可供该值之后的任何内容使用。

© www.soinside.com 2019 - 2024. All rights reserved.