簡體   English   中英

在 Rust 中的迭代器上編寫 sum 的通用實現

[英]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: CopyT: Clone

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM