我想编写一个通用的函数,它接受任何不可改变借来的迭代容器如数组,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)