如何在Rust宏中将标识符拆分为单个字母?
Rust实现
multiply宏拆分标识符为单个字母相乘 Rust的macro_rules!并没有:letter这种内置捕获器,你需要通过递归拆分标识符的方式实现需求。以下是可行的宏代码:
macro_rules! multiply { // 递归匹配:拆分出第一个字母标识符和剩余部分 ($first:ident $rest:ident) => { $first * multiply!($rest) }; // 递归终止条件:单个字母标识符 ($single:ident) => { $single }; }
测试示例
fn main() { let a = 4; let b = 7; println!("{}", multiply!(abbabbb)); // 输出结果为 268912 // 宏展开后等价于:a * b * b * a * b * b * b }
原理说明
该宏通过递归拆解传入的标识符,每次将其拆分为第一个字符组成的合法标识符和剩余字符组成的标识符,直到剩余部分是单个字母标识符时终止递归,最终将所有拆分出的标识符用*运算符连接,实现连续相乘的效果。
注意:传入的标识符必须全部由单个字母的合法标识符组成(不能包含数字、下划线开头等不符合Rust标识符规则的内容),否则宏会匹配失败。
内容的提问来源于stack exchange,提问作者Arseny Staroverov
相关产品推荐
相关产品推荐

