You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust如何匹配带结构体的枚举并传递其值调用对应函数

Rust枚举匹配中传递结构体值的正确模式

你的问题出在使用_作为匹配占位符——这个符号会忽略枚举变体中携带的结构体值,导致无法传递给处理函数。正确的做法是在匹配模式中声明变量名,让Rust将结构体值绑定到该变量上,之后直接使用变量调用处理函数。

修正后的完整代码

#[derive(Clone)]
pub enum MyEnum {
    ChoiceA(DetailA),
    ChoiceB(DetailB),
}

#[derive(Clone)]
pub struct DetailA {
    pub message: String,
}

#[derive(Clone)]
pub struct DetailB {
    pub password: String,
    pub value: u8,
}

pub fn handleChoiceA(input: DetailA) {
    println!("Choice A {}", input.message);
}
pub fn handleChoiceB(input: DetailB) {
    println!("Choice B {}", input.password);
}

fn main() {
    let value = MyEnum::ChoiceA(DetailA {
        message: "Test".to_string()
    });
    
    match value {
        // 将ChoiceA中的DetailA实例绑定到detail_a变量
        MyEnum::ChoiceA(detail_a) => handleChoiceA(detail_a),
        // 将ChoiceB中的DetailB实例绑定到detail_b变量
        MyEnum::ChoiceB(detail_b) => handleChoiceB(detail_b),
    }
}

额外优化:保留原枚举值的场景

如果后续还需要使用原value变量,不想转移所有权,可以通过引用匹配来实现:

// 修改处理函数接受引用(避免克隆)
pub fn handleChoiceA(input: &DetailA) {
    println!("Choice A {}", input.message);
}
pub fn handleChoiceB(input: &DetailB) {
    println!("Choice B {}", input.password);
}

fn main() {
    let value = MyEnum::ChoiceA(DetailA {
        message: "Test".to_string()
    });
    
    // 匹配value的引用
    match &value {
        MyEnum::ChoiceA(detail_a) => handleChoiceA(detail_a),
        MyEnum::ChoiceB(detail_b) => handleChoiceB(detail_b),
    }
    // 此时value仍然可以正常使用
}

内容的提问来源于stack exchange,提问作者Patrick Desjardins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 02:50:28