Generics 编写一个泛型函数,将iterable容器作为Rust中的参数

Generics 编写一个泛型函数,将iterable容器作为Rust中的参数,generics,iterator,rust,lifetime,Generics,Iterator,Rust,Lifetime,我想编写一个通用函数,该函数接受任何不可变的可移植容器,如数组、Vec、BTreeSet,等等。由于此函数是我正在实现的特性的一部分,因此我无法更改它的签名,因此,不可能直接将迭代器作为参数,也不能将任何生存期参数引入函数签名 上下文 我试图在Rust中实现观察器模式。可观察者和观察者如下所示: struct Observable<T> { value: T, } impl<T> Observable<T> { pub fn get(&

我想编写一个通用函数,该函数接受任何不可变的可移植容器,如数组、
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>);
}
到目前为止 很长一段时间以来,我一直试图编译
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 observable.get() {
            sum += (self.get_value)(item);
        }
        *self.current_sum.borrow_mut() = sum;
    }
}
如果整个函数体被注释掉,错误消息甚至保持不变。如果我同时删除
where
-子句,编译就可以工作了

如果我按照编译器的建议为参数类型添加显式生存期界限:

impl<'a, T: 'a, L: 'a> Observer<L> for SumObserver<T>
impl src/lib.rs:22:6
|

22 | impl这是高等级特质界限(HRTB)的情况

关键是,您不希望
&L
在一个生命周期内实现
到迭代器
,而是在
L
可能具有的所有潜在生命周期内实现


在这种情况下,您需要使用更高等级的特征边界:
for这是更高等级的特征边界(HRTB)的情况

关键是,您不希望
&L
在一个生命周期内实现
到迭代器
,而是在
L
可能具有的所有潜在生命周期内实现

在这种情况下,您需要使用更高级别的Trait绑定:
for
impl<'a, T: 'a, L: 'a> Observer<L> for SumObserver<T>
impl<T, L> Observer<L> for SumObserver<T>
where
    for<'a> &'a L: IntoIterator<Item = &'a T>,
{
    fn update(&self, observable: &Observable<L>) {
        let mut sum: i64 = 0;
        for item in observable.get() {
            sum += (self.get_value)(item);
        }
        *self.current_sum.borrow_mut() = sum;
    }
}