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

如何在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::NegInfinity
  • dn!(inf) 对应 DashNumber::Infinity
  • dn!(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:13:21