Rust声明式宏如何判断可选捕获组内的参数是否已定义
解决方案
你可以通过拆分内部辅助规则的方式实现可选参数的默认值填充,无需依赖宏重载,适配复杂参数组合的场景,实现代码如下:
macro_rules! foo { // 入口规则:匹配外层传参 (name: $name: ident$(, media: $media: tt)?) => { pub struct $name; impl $name { // 调用内部辅助规则处理media参数的默认值 const MEDIA: &str = foo!(@get_media $($media)?); } }; // 内部规则1:匹配到传入了media参数的场景,直接返回传入值 (@get_media $media:tt) => { $media }; // 内部规则2:未匹配到media参数的场景,返回默认值 (@get_media) => { "DEFAULT" }; } // 测试调用 foo! { name: Hey, media: "hey" } foo! { name: Hey2 }
实现原理
- 入口规则捕获可选的
media参数后,会将捕获结果直接传给前缀为@的内部辅助规则(Rust宏没有私有规则约束,用@前缀只是约定俗成的内部规则标识) - 如果用户传入了
media参数,$($media)?展开后是实际传入的值,会命中带参数的辅助规则分支,直接返回传入值 - 如果用户未传入
media参数,$($media)?展开后为空,会命中无参数的辅助规则分支,返回预设的默认值 - 该模式可以轻松扩展到多可选参数的场景,不需要像宏重载那样枚举所有参数组合,完全适配复杂宏的开发需求
测试验证:Hey::MEDIA的值为"hey",Hey2::MEDIA的值为"DEFAULT",符合预期。
内容的提问来源于stack exchange,提问作者sno2
相关产品推荐
相关产品推荐

