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

如何在声明式宏中基于布尔字面量实现条件展开?

实现方案

可以仅通过声明式宏实现这个需求,核心利用声明式宏的模式匹配特性,针对布尔字面量的true和false分别处理:

宏实现代码

macro_rules! conditionally_expand {
    // 匹配true字面量,直接展开传入的代码项
    (true, $item:item) => { $item };
    // 匹配false字面量,展开空内容,不生成任何代码
    (false, $item:item) => {};
}

完整测试代码

将上述宏与你的示例代码结合,完整代码如下:

macro_rules! conditionally_expand {
    (true, $item:item) => { $item };
    (false, $item:item) => {};
}

macro_rules! my_macro {
    {
        $cond1:literal,
        $cond2:literal
    } => {
        conditionally_expand! { $cond1, fn f1() { println!("1"); } }
        conditionally_expand! { $cond2, fn f2() { println!("2"); } }
    };
}

fn main() {
    my_macro!{false, true};
    // f1(); // 取消注释会触发编译错误:未找到函数`f1`
    f2(); // 正常编译运行,输出"2"
}

原理说明

  1. 声明式宏在编译期进行模式匹配,当传入true时,宏会匹配第一个分支,直接输出捕获到的函数/类型定义;
  2. 当传入false时,匹配第二个分支,输出空内容,相当于完全不生成对应的代码项;
  3. 使用$item:item捕获器是因为它可以兼容函数、结构体、枚举等多种Rust代码项,满足“展开函数或类型定义”的需求。

内容的提问来源于stack exchange,提问作者carlo.milanesi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:16:18