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

如何在macro_rule!中拆分模块与函数名实现指定代码生成?

用macro_rules!实现路径拆分的解决方案

不需要用过程宏,通过递归辅助宏就能实现你的需求。核心思路是用递归逐步拆分完整路径,分离出模块前缀和最终的函数名,再生成对应的代码。

实现代码

macro_rules! my_macro {
    // 处理无模块的单函数名情况
    ($f:ident) => {
        fn $f() {
            $f();
        }
    };
    // 启动递归:匹配带模块的路径,触发辅助规则
    ($mod:ident:: $($rest:tt)+) => {
        my_macro!(@inner $($rest)+ $mod::);
    };
    // 辅助规则:匹配到最终函数名+已收集的模块前缀
    (@inner $f:ident, $prefix:path) => {
        fn $f() {
            $prefix$f();
        }
    };
    // 辅助规则:继续收集模块前缀,递归处理剩余路径
    (@inner $mod:ident:: $($rest:tt)+, $prefix:path) => {
        my_macro!(@inner $($rest)+, $prefix$mod::);
    };
}

测试示例

// 定义测试模块和函数
mod some_module {
    pub fn some_fkt() {
        println!("Executing some_module::some_fkt");
    }
}

// 调用宏生成函数
my_macro!(some_module::some_fkt);

fn main() {
    some_fkt(); // 实际调用some_module::some_fkt()
}

为什么之前的写法有问题

你尝试的$($module:ident::)+$method:ident会触发歧义错误,是因为Rust的macro_rules!在处理重复模式+时,无法明确划分模块层级(比如a::b::c可能被拆成[a::]+c,也可能被拆成[a::b::]+c)。递归宏通过逐层拆分每一个ident::部分,完全避免了这种歧义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:55:03