给定以下函数:
fn some_function<K, F: Fn(K) -> K>(f: F, vs: Vec<K>) -> Vec<K> {
let mut index = 0;
let new_vec = vs.iter().map(|x| {
index += 1;
for _ in 1 .. index {
x = f(x); // <- error here: mismatched types expected reference `&K` found type parameter `K`
}
*x
}).collect();
new_vec
}
我怎么才能让它工作呢?
2条答案
按热度按时间fnx2tebb1#
Rust中有3种类型的变量:
这又Map到3个不同的迭代函数:
.into_iter()
将返回一个值的迭代器。.iter()
将返回共享引用上的迭代器。.iter_mut()
将返回可变引用上的迭代器。您只是没有选择正确的函数,而应该使用
into_iter
。此外:
enumerate
将允许您在迭代时获得每个元素的索引,这样您就不必自己维护索引。i
项,您需要0..i
,而不是1..i
。然而,为了提高性能,如果可能的话,最好 * 就地 * 修改元素。这允许重用缓冲区,包括向量自己的缓冲区。结果将是:
osh3o9ms2#
这个例子不起作用,因为
.iter()
不会产生一个所属变量的迭代器,而是对vs
元素的引用。但您不需要跟踪
index
: