将 Add 实现应用于借用的参数

Applying Add implementation to borrowed arguments

我正在尝试添加实现 Add 的泛型类型的两个借用参数。我的实际方法更复杂,但我的问题的本质被这个简化的例子抓住了:

pub fn my_add<T: Add<Output = T>>(a: &T, b: &T) -> T
{
    a + b
}

我收到一条错误消息,指出 + 无法应用于类型 &T

我的想法是,虽然我已经指出 Add 是为 T 实施的,但我没有指出它是为 &T 实施的。但是,如果我将函数声明更改为 my_add<&T: Add...>,编译器会抱怨它需要一个标识而不是 &。 我试过将 & 放在许多不同的位置,但无济于事。

我在这里错过了什么?

首先,如果您检查 documentation for Add,您会看到它被定义为按值 获取参数 。不幸的是,您不能简单地取消引用 ab,因为这需要移出不可变引用,这是不允许的。

有两种方法可以解决这个问题:您可以添加一个 Clone 绑定到 T,如下所示:

pub fn my_add<T: Add<Output = T> + Clone>(a: &T, b: &T) -> T
{
    a.clone() + b.clone()
}

...或者您可以首先按值取 ab

pub fn my_add<T: Add<Output = T>>(a: T, b: T) -> T
{
    a + b
}

顺便说一句,您不能添加随机印记来键入参数名称;如果你想要比提供基本约束更复杂的东西,你需要一个 where 子句,像这样:

fn made_up_nonsense<T>(a: T) -> T where &T: SomeTrait, T: SomeOtherTrait {
    ...
}