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

如何在Rust的macro_rules!中用单规则实现函数定义宏?

用单规则实现Rust的define_fn!宏

完全可以用单规则实现这个需求,核心是利用Rust宏系统的重复捕获和可选片段语法覆盖所有场景。以下是实现代码:

macro_rules! define_fn {
    ( $( $vis:vis )? fn $ident:ident ( $( $arg:ident : $ty:ty ),* $(,)? ) ) => {
        $( $vis )? fn $ident ( $( $arg : $ty ),* ) {}
    };
}

语法解析

  • $( $vis:vis )?:匹配可选的可见性修饰符(如pub),?表示该片段可出现0次或1次,兼容有无修饰符的情况。
  • fn $ident:ident:固定匹配函数关键字fn和函数名标识符。
  • ( $( $arg:ident : $ty:ty ),* $(,)? ):处理参数列表:
    • $( $arg:ident : $ty:ty ),*:捕获任意数量的“参数名:类型”组合,用逗号分隔;
    • $(,)?:匹配参数列表末尾可选的多余逗号,解决用户输入末尾带逗号的场景。
  • 展开部分直接复用捕获到的片段,其中参数列表的$( $arg : $ty ),*会自动生成无多余末尾逗号的参数列表,最终输出带空函数体的完整函数定义。

验证场景

所有给定的测试用例都能正确展开:

  1. 无修饰符、无参数
define_fn!(fn a());
// 展开结果:fn a() {}
  1. 带pub修饰符、无参数
define_fn!(pub fn a());
// 展开结果:pub fn a() {}
  1. 无修饰符、单参数带末尾逗号
define_fn!(fn a(arg1: u32,));
// 展开结果:fn a(arg1: u32) {}
  1. 带pub修饰符、多参数无末尾逗号
define_fn!(pub fn a(arg1: u32, arg2: i32));
// 展开结果:pub fn a(arg1: u32, arg2: i32) {}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:02:07