小编Zoi*_*erg的帖子

编写一个泛型函数,该函数将可迭代容器作为Rust中的参数

我想编写一个通用的函数,它接受任何不可改变借来的迭代容器如数组,Vec,BTreeSet,等.由于这个功能是我实现一个特质的一部分,我不能改变它的签名,所以它不是可以直接将迭代器作为参数,我也不能将任何生命周期参数引入函数签名.

上下文

我试图在Rust中实现观察者模式.观察者和观察者看起来如下:

struct Observable<T> {
    value: T,
}

impl<T> Observable<T> {
    pub fn get(&self) -> &T {
        &self.value
    }
}

trait Observer<T> {
    fn update(&self, &Observable<T>);
}
Run Code Online (Sandbox Code Playgroud)

(省略了与我的问题无关的一些功能)

现在我的目标是编写一个可以与任意可迭代容器一起使用的观察器,该容器包含可以赋值的项.它应该跟踪容器中项目的值的总和,因此保持当前的总和以及计算任何项目的值的函数.它应该实现Observer特征,以​​便每次容器更改时都可以更新总和.

use std::cell::RefCell;

struct SumObserver<T> {
    current_sum: RefCell<i64>,
    get_value: Fn(&T) -> i64,
}
Run Code Online (Sandbox Code Playgroud)

到目前为止的方法

我试图让update函数编译很长一段时间都没有成功.以下是我尝试过的函数版本之一:

impl<'a, T, L> Observer<L> for SumObserver<T>
where
    &'a L: IntoIterator<Item = &'a T>,
{
    fn update(&self, observable: &Observable<L>) {
        let mut sum: i64 = 0;
        for item in …
Run Code Online (Sandbox Code Playgroud)

generics iterator lifetime rust

13
推荐指数
1
解决办法
3549
查看次数

标签 统计

generics ×1

iterator ×1

lifetime ×1

rust ×1