+
运算符如何用作重复分隔符?
fn dot(self, rhs: Self) -> S {
$(self.$s * rhs.$s)++
}
$s
将是 x
、y
、z
,所以我希望宏扩展到self.x * rhs.x + self.y * rhs.y + self.z * rhs.z
。如果我写 $(self.$s * rhs.$s)-+
,那么它可以工作并扩展为减法,但我需要加法,是否可以转义 +
token ?
最佳答案
不幸的是,this isn't directly possible (从 rustc 1.41 开始)。该问题中提到的解决方法是将加号放在重复中的每个项目之前,并使用一个单独的宏来去除前面的额外加号。
macro_rules! strip_plus {
(+ $($rest: tt)*) => {
$($rest)*
}
}
它是这样使用的:
macro_rules! sum_all {
($($items: tt)+) => {
strip_plus!($(+ $items)+)
}
}
fn main() {
assert_eq!(sum_all!(1 2 3 4 5), 15);
}
关于带加号的 Rust 宏重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60187436/