Hi I have code as following:
fn foo(_: impl Iterator<Item = impl Borrow<i32>>)->impl Iterator<Item=i32>{
let mut v = Vec::new(); // new allocated object
v.push(30); // has nothing to do with input parameter
v.into_iter() //return takes ownership
}
fn bar(){
let input = vec![1,2,3];
let output0 = foo(input.iter()); //output0 should have nothing to do with input
let output1 = foo(input.into_iter());
let _output2 = foo(output0); //why rust thinks output0 still borrowed input ??
}
and rust throws
error[E0505]: cannot move out of `input` because it is borrowed
--> src/ask.rs:42:27
|
41 | let output0 = foo(input.iter());
| ----- borrow of `input` occurs here
42 | let output1 = foo(input.into_iter());
| ^^^^^ move out of `input` occurs here
43 | let _output2 = foo(output0);
| ------- borrow later used here
This makes me confused. if change return of foo to Vec, or IntoIter, everything worked
fn foo2(_: impl Iterator<Item = impl Borrow<i32>>)->Vec<i32>{
let mut v = Vec::new();
v.push(30);
v
}
fn bar2(){
let input = vec![1,2,3];
let output0 = foo2(input.iter());
let output1 = foo2(input.into_iter());
let output2 = foo2(output0.iter());
}
this works
fn foo2(_: impl Iterator<Item = impl Borrow<i32>>) -> std::vec::IntoIter<i32> {
let mut v = Vec::new();
v.push(30);
v.into_iter()
}
fn bar2(){
let input = vec![1,2,3];
let output0 = foo2(input.iter());
let output1 = foo2(input.into_iter());
let output2 = foo2(output0);
}
this also works, why ? Thanks for help