Rust 宏用加号重复

Koc*_*vid 4 rust

运算符如何+用作重复分隔符?

fn dot(self, rhs: Self) -> S {
    $(self.$s * rhs.$s)++
}
Run Code Online (Sandbox Code Playgroud)

$s将是x, y,z所以我想将宏扩展为self.x * rhs.x + self.y * rhs.y + self.z * rhs.z。如果我写$(self.$s * rhs.$s)-+,那么它可以工作并扩展到减法,但我需要加法,是否可以转义+标记?

SCa*_*lla 7

不幸的是,这不可能直接实现(从 rustc 1.41 开始)。该问题提到的解决方法是将加号放在重复中的每个项目之前,并使用一个单独的宏来去除前面的额外加号。

macro_rules! strip_plus {
    (+ $($rest: tt)*) => {
        $($rest)*
    }
}
Run Code Online (Sandbox Code Playgroud)

它的使用方式如下:

macro_rules! sum_all {
    ($($items: tt)+) => {
        strip_plus!($(+ $items)+)
    }
}

fn main() {
    assert_eq!(sum_all!(1 2 3 4 5), 15);
}
Run Code Online (Sandbox Code Playgroud)

(操场)