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
相关产品推荐
相关产品推荐

