[英]Writing generic implementation of sum on an iterator in Rust
我一直在学习 Rust,来自 Swift、C 和 C++ 背景。 我觉得我对所有权、借用和特征有了基本的了解。 为了练习一下,我决定在通用切片[T]
上实现sum
function,其中T
具有默认值并且可以添加到自身。
这是我走了多远:
trait Summable {
type Result;
fn sum(&self) -> Self::Result;
}
impl<T> Summable for [T]
where
T: Add<Output = T> + Default,
{
type Result = T;
fn sum(&self) -> T {
let x = T::default();
self.iter().fold(x, |a, b| a + b)
}
}
编译器抱怨expected type parameter T, found &T
for a + b
。
我明白为什么会发生错误,但不知道如何解决它。 是的, x
的类型是T
。 它不能是&T
因为,如果没有别的,如果切片是空的,那就是返回的值,我不能返回对 function 内部创建的东西的引用。另外,默认 function 返回一个新值,function 内部的代码拥有。 说得通。 是的, b
应该是对切片中值的共享引用,因为我不想使用它们(不是T
)并且我不想改变它们(不是&mut T
)。
但这意味着我需要将T
添加到&T
,并返回一个T
因为我要返回一个将由调用者拥有的新值(总和)。 如何?
PS:是的,我知道这个 function 已经存在了。 这是一个学习练习。
std::ops::Add
特性有一个可选的Rhs
类型参数,默认为Self
:
pub trait Add<Rhs = Self> {
type Output;
fn add(self, rhs: Rhs) -> Self::Output;
}
因为您从T: Add<Output = T>
绑定中省略了Rhs
类型参数,所以它默认为T
: 因此您可以在a
中添加T
,但不能添加&T
。
要么指定T: for<'a> Add<&'a T, Output = T>
; 或者以某种方式从b
获取拥有的T
,例如通过T: Copy
或T: Clone
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.