【发布时间】:2019-12-23 21:15:43
【问题描述】:
我想将迭代器传递给一个函数,该函数然后从这些迭代器中计算一些值。 我不确定这样一个函数的健壮签名会是什么样子。 假设我想迭代 f64。 您可以在操场上找到代码:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=c614429c541f337adb102c14518cf39e
我的第一次尝试是
fn dot(a : impl std::iter::Iterator<Item = f64>,b : impl std::iter::Iterator<Item = f64>) -> f64 {
a.zip(b).map(|(x,y)| x*y).sum()
}
如果我们尝试迭代切片,这将无法编译
所以你可以这样做
fn dot<'a>(a : impl std::iter::Iterator<Item = &'a f64>,b : impl std::iter::Iterator<Item = &'a f64>) -> f64 {
a.zip(b).map(|(x,y)| x*y).sum()
}
如果我尝试遍历映射范围,则编译失败。 (为什么编译器在这里需要livetime参数?)
所以我尝试接受引用而不是一般引用:
pub fn dot<T : Borrow<f64>, U : Borrow<f64>>(a : impl std::iter::Iterator::<Item = T>, b: impl std::iter::Iterator::<Item = U>) -> f64 {
a.zip(b).map(|(x,y)| x.borrow()*y.borrow()).sum()
}
这适用于我尝试过的所有组合,但它非常冗长,我并不真正了解它的各个方面。
还有更多案例吗?
解决这个问题的最佳做法是什么?
【问题讨论】: