Rust中数组的加法重载


在Rust中尝试求和两个数组([1.0, 2.0] + [3.0, 4.0](失败,因为没有为数组定义加法。我试图使操作过载:
use std::ops::Add;
type float = f64;
impl<const N: usize> Add for [float;N] {
type Output = Self;
fn add(x : [float; N], y : [float; N]) {
let z : [float; N];
for i in 1..=N { z[i] = x[i] + y[i]; }
z
}
}

然而,现在rustc表示这是不允许的:"只有在当前机箱中定义的特征才能实现任意类型"。Rust也不允许定义自定义运算符,例如.+或用于元素添加的运算符。

我为什么要这样的东西?我正在考虑使用Rust进行数值计算,因为我受够了Julia的动态类型,当它无法专门处理函数时,我会浪费数小时试图减少隐藏的内存分配。然而,要求自定义类型和样板代码来求和两个数组似乎并不太实际。对于大数组,当然需要使用其他东西;有ndarray,但基于刚刚尝试将其包装成一个通用的LinearOperator特征,它似乎有自己的问题,因为缺乏AbstractArray特征或枚举来覆盖具体的数组和视图,以及有点奇怪的仅rhs的寿命(尽管后者可能只是我在试着学习寿命(。但是,对于到处发生的简单而快速的"内环"计算来说,这样的事情既不可行,也不高效。另一方面,必须使用ascii文字函数进行标准数学运算也无助于可读性。

有什么想法吗?未来有没有希望获得自定义(unicode(运算符,或者至少能够在本地重载标准运算符?(如果有人想抱怨用户可能定义了无意义的不可读运算符,我可以对比特运算符说同样的话。说真的,2021年,你把这些放在了语言本身中?!?(

你不能为别人的类型实现别人的特性。这是为了防止定义冲突。如果你和我都写了一个定义vec加法的板条箱,而其他人同时使用这两个板条箱呢?应该使用谁的实现?

您可以做的是将vec封装在自己的类型中,并为该类型定义Add。

struct MyVec<T> { 
fn new(from: Vec<T>) { ...
}
impl Add for MyVec { ... }

如果你想让对底层Vec的访问透明(就像对Box-Arc Mutex等的访问一样(,你可以为你的类型implderef。

类似这样的操作将允许您轻松地调用新类型上的所有vec方法。

use std::ops::Deref;
struct MyVec<T> {
value: T
}
impl<T> Deref for MyVec<T> {
type Target = Vec<T>;
fn deref(&self) -> &Self::Target {
&self.value
}
}

最新更新