带加号的 Rust 宏重复

标签 rust

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

fn dot(self, rhs: Self) -> S {
    $(self.$s * rhs.$s)++
}

$s 将是 xyz,所以我希望宏扩展到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);
}

(playground)

关于带加号的 Rust 宏重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60187436/

相关文章:

rust - 为什么 rustc 不运行我的简单 "hello world"程序?

syntax - Some() 在变量赋值的左侧做什么?

polymorphism - 属于特征的对象的向量

rust - rustfmt的未知配置选项 `group_imports`

rust - 如何从Rust(火箭)HTTP端点返回JSON?

sorting - 为什么我的 InsertionSort 的 Rust 实现比我的 C 版本慢?

rust - 如何使用Serde在反序列化期间转换字段?

string - 为什么我不能将两个字符串连接在一起,但我可以连接一个字符串和一个 &str?

Rust 实现带有私有(private)字段的默认特征

rust - 编译为Wasm时,指向堆分配的内存的Rust指针可以为0吗?