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

Rust声明式宏`expr_enum`无法正常运行,请求排查修复

修正你的Rust expr_enum 宏问题

先解决你提到的几个显性错误:

  • 把所有错误的expr!调用替换成expr_enum!,宏调用名称必须与定义完全匹配。
  • 确保代码中仅调用一次expr_enum!,且只保留一个main函数,避免重复定义导致的编译错误。

以下是调整后的可行实现,分两种场景解决问题:

场景1:宏仅负责生成Enum实例(推荐)

将枚举定义与实例生成拆分,避免宏重复生成枚举代码:

// 仅定义一次枚举,避免重复编译错误
#[derive(Debug)]
enum Expr {
    Base(i32),
    Not(Box<Expr>),
}

// 宏专注于简化Enum实例的创建
macro_rules! expr_enum {
    // 匹配Base分支,接收任意表达式作为关联值
    (Base($e:expr)) => {
        Expr::Base($e)
    };
    // 匹配Not分支,接收Expr实例并包装为Box
    (Not($e:expr)) => {
        Expr::Not(Box::new($e))
    };
}

fn main() {
    // 生成Base类型实例
    let base_inst = expr_enum!(Base(42));
    println!("{:?}", base_inst);

    // 生成嵌套的Not类型实例
    let not_inst = expr_enum!(Not(base_inst));
    println!("{:?}", not_inst);
}

场景2:宏同时定义枚举并生成实例(单一场景使用)

如果需要宏一次性完成枚举定义和实例生成,可调整为仅支持单次调用的写法:

macro_rules! expr_enum {
    (Base($e:expr)) => {
        #[derive(Debug)]
        enum Expr {
            Base(i32),
            Not(Box<Expr>),
        }
        Expr::Base($e)
    };
    (Not($e:expr)) => {
        #[derive(Debug)]
        enum Expr {
            Base(i32),
            Not(Box<Expr>),
        }
        Expr::Not(Box::new($e))
    };
}

fn main() {
    // 仅调用一次宏,避免重复定义Enum
    let inst = expr_enum!(Base(100));
    println!("{:?}", inst);
}

匹配符选择说明

  • 使用$e:expr是生成Enum实例的最优选择,它能精准匹配任意合法的Rust表达式(数值、变量、函数调用等)。
  • 若需处理更灵活的Token序列,可尝试$e:tt,但对于当前场景,expr匹配符更贴合需求。

编译运行上述代码后,会正确输出Enum实例内容,解决你遇到的所有问题。

内容的提问来源于stack exchange,提问作者Ventsislav Monev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:49:59