[英]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.