I have created a data structure in Rust and I want to create iterators for it. Immutable iterators are easy enough. I currently have this, and it works fine:
// This is a mock of the "real" EdgeIndexes class as // the one in my real program is somewhat complex, but // of identical type struct EdgeIndexes; impl Iterator for EdgeIndexes { type Item = usize; fn next(&mut self) -> Option<Self::Item> { Some(0) } fn size_hint(&self) -> (usize, Option<usize>) { (0, None) } } pub struct CGraph<E> { nodes: usize, edges: Vec<E>, } pub struct Edges<'a, E: 'a> { index: EdgeIndexes, graph: &'a CGraph<E>, } impl<'a, E> Iterator for Edges<'a, E> { type Item = &'a E; fn next(&mut self) -> Option<Self::Item> { match self.index.next() { None => None, Some(x) => Some(&self.graph.edges[x]), } } fn size_hint(&self) -> (usize, Option<usize>) { self.index.size_hint() } } I want to create a iterator that returns mutable references as well. I've tried doing this, but can't find a way to get it to compile:
pub struct MutEdges<'a, E: 'a> { index: EdgeIndexes, graph: &'a mut CGraph<E>, } impl<'a, E> Iterator for MutEdges<'a, E> { type Item = &'a mut E; fn next(&mut self) -> Option<&'a mut E> { match self.index.next() { None => None, Some(x) => self.graph.edges.get_mut(x), } } fn size_hint(&self) -> (usize, Option<usize>) { self.index.size_hint() } } Compiling this results in the following error:
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements --> src/lib.rs:54:24 | 54 | Some(x) => self.graph.edges.get_mut(x), | ^^^^^^^^^^^^^^^^ | note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 51:5... --> src/lib.rs:51:5 | 51 | / fn next(&mut self) -> Option<&'a mut E> { 52 | | match self.index.next() { 53 | | None => None, 54 | | Some(x) => self.graph.edges.get_mut(x), 55 | | } 56 | | } | |_____^ note: ...so that reference does not outlive borrowed content --> src/lib.rs:54:24 | 54 | Some(x) => self.graph.edges.get_mut(x), | ^^^^^^^^^^^^^^^^ note: but, the lifetime must be valid for the lifetime 'a as defined on the impl at 48:6... --> src/lib.rs:48:6 | 48 | impl<'a, E> Iterator for MutEdges<'a, E> { | ^^ = note: ...so that the expression is assignable: expected std::option::Option<&'a mut E> found std::option::Option<&mut E> I'm unsure how to interpret these errors and how to change my code in order to allow MutEdges to return mutable references.
Link to playground with code.
mut_shift_ref(), maybe you can find what you need there : doc.rust-lang.org/std/slice/…mut_shift_ref. Just click the [src] button in the documentation to see the source code ofMutItems.