【问题标题】:Indexing a tuple using a macro in Rust unexpected token在 Rust 意外标记中使用宏索引元组
【发布时间】:2023-02-26 01:52:45
【问题描述】:

我正在尝试创建一个宏来对元组中的每个元素执行特定操作,以补偿无法迭代它们的情况。

我写了一些代码来复制我的问题:

fn main() {
    let tuple = (1, 2);

    macro_rules! index_tuple {
        ($($i:literal),+) => {
            $(
                let t$i = tuple.$i;
            )+
        }
    }
    
    index_tuple!(0, 1);
}

Rust playground link


但是我遇到了以下错误:

error: expected one of \`:\`, \`;\`, \`=\`, \`@\`, or \`|\`, found \`0\`

我尝试用 CLion 扩展宏,扩展后的宏运行得非常好,所以我不确定这是否是我的错。

【问题讨论】:

    标签: rust tuples rust-macros


    【解决方案1】:

    Rust 宏不是简单的文本操作。因此,您的宏当前所做的是生成标记 'let' 't' '0' '=' 'tuple' '.' '0',如果您想加入它们,您必须使用 quote!,这是众所周知的功能不足并且无法创建新标识符,因此它在这里不起作用或 paste::paste!

    use paste::paste;
    fn main() {
        let tuple = (1, 2);
    
        macro_rules! index_tuple {
            ($($i:literal),+) => { paste!{
                $(
                    let [<t $i>] = tuple.$i;
                )+
            }}
        }
    
        index_tuple!(0, 1);
    }
    

    然后您会遇到下一个问题,因为无法从宏外部访问在声明性宏中定义的宏卫生标识符。或者换句话说,t0t1 在宏之后和之前一样是未定义的。所以你的宏看起来毫无意义,但也许这只是最小化它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2016-08-28
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      相关资源
      最近更新 更多