< 返回版块

koqizhao 发表于 2019-10-28 20:49

Tags:macro

我有一个macro:

macro_rules! test {
    ($trait:tt<$($param:literal)+>) => {
        {
            println!("{}", stringify!($($param)++));
        }
    };
}

现在输出是:

1 2 3 +

我想得到输出:

1 + 2 + 3

评论区

写评论
作者 koqizhao 2019-10-29 19:26

末尾会多一个+

1 + 2 + 3 +

对以下内容的回复:

Aloxaf 2019-10-29 11:19

你把第一个 + 移到括号里面就行了 stringify!($($param+)+)

作者 koqizhao 2019-10-29 07:32

对以下内容的回复:

谢谢。这样可以。

+在宏里作为op,本身是特殊字符,导致++中的第1个+被解析成了op而不是+字符本身。是否rust存在某种转义语法可以处理这个特殊字符,可以有更自然的写法。

Aloxaf 2019-10-29 00:54

我感觉这是个 XY 问题...

macro_rules! test {
    ($trait:tt<$param0:literal $($param1:literal)*>) => {
        {
            println!("{}", stringify!($param0 $(+ $param1)*));
        }
    };
}

fn main() {
    test!(Foo<1>);
    test!(Foo<1 2 3>);
}
simoin 2019-10-28 22:54
macro_rules! test {
    ($($param:expr),*) => {
        {
            let mut _v = ::std::vec::Vec::new();
            $( _v.push($param); )*
            println!("{}", _v.join(" + "));
        }
    }
}

fn main() {
    test!("1", "2");
}
1 共 5 条评论, 1 页