如何在Rust宏参数中使用Unicode?宏定义报错求助
Rust宏定义使用∞符号报错的问题
你写的这段代码里,宏dn!试图用Unicode的∞(无穷大符号)作为匹配模式,但Rust的词法分析器(tokenizer)不把这个符号当作合法的语法token,所以会抛出unknown start of token错误。
问题根源
Rust的语法规则只允许特定字符作为标识符、字面量或运算符的一部分,像∞这类Unicode数学符号不在合法token范围内,宏的模式匹配依赖于Rust能正确识别的token,直接写(-∞)或(∞)会被解析器判定为无效语法。
解决方法
方案一:改用合法标识符(推荐)
用Rust能识别的-inf和inf替代∞,修改后的代码如下:
enum DashNumber<N> { NegInfinity, Number(N), Infinity, } macro_rules! dn { (-inf) => { DashNumber::NegInfinity }; (inf) => { DashNumber::Infinity }; ($e:expr) => { DashNumber::Number($e) }; }
修改后可正常调用宏:
dn!(-inf)对应DashNumber::NegInfinitydn!(inf)对应DashNumber::Infinitydn!(123)对应DashNumber::Number(123)
方案二:将∞作为字符串字面量处理(不推荐)
如果一定要保留∞符号,可把它当作字符串字面量匹配,但调用时需要加引号,示例如下:
enum DashNumber<N> { NegInfinity, Number(N), Infinity, } macro_rules! dn { ("-∞") => { DashNumber::NegInfinity }; ("∞") => { DashNumber::Infinity }; ($e:expr) => { DashNumber::Number($e) }; } // 调用示例 let _ = dn!("-∞"); let _ = dn!("∞"); let _ = dn!(456);
内容的提问来源于stack exchange,提问作者Rainb
相关产品推荐
相关产品推荐

