I am giving a mutable reference of a Vec to an Iterator, so it can add Elements to it while just keeping an index of the Element. Thus after the Iterator being "used" shouldn't then the Vec be able to be referenced again?
(Here a link to a Rust playground example)
struct MyElement{
category_index: usize,
...
}
impl MyElement{
fn iter_from_src<'a>(source: &'a str, categories: &'a mut Vec<&'a str>)
-> impl Iterator< Item = MyElement > {
...
std::iter::from_fn(move || -> Option<MyElement> {
... //some iterator logic
let category = find_category_in_source(source);
if let Some(index) = categories.iter().position(|c| *c == category) {
//no reference of categories is given to MyElement exept of the index
Some( MyElement{ category_index: index, ... } )
} else {
let index = categories.len();
// the only mutable usage of categories
categories.push(category);
Some( MyElement{ category_index: index, ... } )
}
})
}
}
fn main() {
let source: String = get_source();
let mut categories = Vec::with_capacity(32);
let mut elements = Vec::with_capacity(1024);
for element in MyElement::iter_from_src(&source, &mut categories) {
elements.push(element);
}
...
// error occurs here
println!("{categories:#?}");
}
and there is no difference in using
let elements = MyElement::iter_from_src(&source, &mut categories).collect();
instead of the for-loop.
Eitherway the compiler Refuses:
error[E0502]: cannot borrow `categories` as immutable because it is also borrowed as mutable
--> src/main.rs:81:16
|
74 | for element in MyElement::iter_from_src(&source, &mut categories) {
| --------------- mutable borrow occurs here
...
81 | println!("{categories:#?}");
| ^^^^^^^^^^
| |
| immutable borrow occurs here
| mutable borrow later used here
I am pretty new to rust so it can just be me understanding a concept wrong.
Still: Why does this throw an error?
And how can it be made possible, that the categories can not be referenced while the Iterator exists though they can afterwards?