使用可变迭代器两次
Use mutable iterator twice
我正在尝试编写一个通用函数,它接受一个可迭代对象(或迭代器)并将其迭代两次,至少一次是可变的,例如:
fn f(iter: I)
where I: Iterator<Item = &mut i32> + Clone {
for i in iter.clone() {
println!("{}", *i);
}
for i in iter.clone() {
*i += 1;
}
}
但它不起作用,因为可变迭代器往往不会实现 clone(),而且出于某些原因。我的真实世界示例是对 HashMap 值的迭代,其中 std::collections::hash_map::ValuesMut
不是克隆。有什么办法吗?
很遗憾,您无法执行此操作。您要么需要将它们合并到一个 for 循环中,要么保存迭代器中的项目以便稍后再次迭代它们。
我能想到的最接近的事情是使用 IntoIterator
来要求参数可以多次用于创建新的迭代器。
pub fn foo<'a, T>(iter: &'a mut T)
where for<'b> &'b mut T: IntoIterator<Item=&'a mut i32> {
for i in iter.into_iter() {
println!("{}", *i);
}
for i in iter.into_iter() {
*i += 1;
}
}
let mut map = HashMap::new();
map.insert(2, 5);
map.insert(6, 1);
map.insert(3, 4);
foo(&mut map.values_mut())
但是,如果您只传递对整个地图的引用,您似乎就不会那么头疼了。
pub fn bar<T>(map: &mut HashMap<T, i32>) {
for i in map.values() {
println!("{}", *i);
}
for i in map.values_mut() {
*i += 1;
}
}
我正在尝试编写一个通用函数,它接受一个可迭代对象(或迭代器)并将其迭代两次,至少一次是可变的,例如:
fn f(iter: I)
where I: Iterator<Item = &mut i32> + Clone {
for i in iter.clone() {
println!("{}", *i);
}
for i in iter.clone() {
*i += 1;
}
}
但它不起作用,因为可变迭代器往往不会实现 clone(),而且出于某些原因。我的真实世界示例是对 HashMap 值的迭代,其中 std::collections::hash_map::ValuesMut
不是克隆。有什么办法吗?
很遗憾,您无法执行此操作。您要么需要将它们合并到一个 for 循环中,要么保存迭代器中的项目以便稍后再次迭代它们。
我能想到的最接近的事情是使用 IntoIterator
来要求参数可以多次用于创建新的迭代器。
pub fn foo<'a, T>(iter: &'a mut T)
where for<'b> &'b mut T: IntoIterator<Item=&'a mut i32> {
for i in iter.into_iter() {
println!("{}", *i);
}
for i in iter.into_iter() {
*i += 1;
}
}
let mut map = HashMap::new();
map.insert(2, 5);
map.insert(6, 1);
map.insert(3, 4);
foo(&mut map.values_mut())
但是,如果您只传递对整个地图的引用,您似乎就不会那么头疼了。
pub fn bar<T>(map: &mut HashMap<T, i32>) {
for i in map.values() {
println!("{}", *i);
}
for i in map.values_mut() {
*i += 1;
}
}