将 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
,您会看到它被定义为按值 获取参数 。不幸的是,您不能简单地取消引用 a
和 b
,因为这需要移出不可变引用,这是不允许的。
有两种方法可以解决这个问题:您可以添加一个 Clone
绑定到 T
,如下所示:
pub fn my_add<T: Add<Output = T> + Clone>(a: &T, b: &T) -> T
{
a.clone() + b.clone()
}
...或者您可以首先按值取 a
和 b
:
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 {
...
}
我正在尝试添加实现 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
,您会看到它被定义为按值 获取参数 。不幸的是,您不能简单地取消引用 a
和 b
,因为这需要移出不可变引用,这是不允许的。
有两种方法可以解决这个问题:您可以添加一个 Clone
绑定到 T
,如下所示:
pub fn my_add<T: Add<Output = T> + Clone>(a: &T, b: &T) -> T
{
a.clone() + b.clone()
}
...或者您可以首先按值取 a
和 b
:
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 {
...
}