lifetime/IntoIterator question

I am confused about a lifetime issue. I have a struct which i have coded up iterators for.

/// NodePath IntoIterator, iterates over owned Nodes in NodePath
pub struct NodePathIntoIterator<'a> {
    nodepath: &'a mut NodePath<'a>,
    index: usize,

impl<'a> Iterator for NodePathIntoIterator<'a> {
    type Item = Node;

    fn next(&mut self) -> Option<Node> {
        if self.index >= self.nodepath.len() {
            return None;

        let idx = self.nodepath.nodes[self.index];
        let result = self.nodepath.graph[idx].clone();
        self.index += 1;

I have a function on NodePath called into_iter() which does this:

pub fn into_iter(&'a mut self) -> NodePathIntoIterator<'a> {
        NodePathIntoIterator{nodepath: self, index: 0}

and i have a test that is failing in a way that doesn’t make sense to me…

    fn into_iter_works() {
        let graph = build_graph();
        let mut np = NodePath::new(&graph);
        for x in graph.node_indices() {
        for x in np.into_iter() {
            println!("{:?}", x);

        assert!(np.count() == 0);

And finally here is the error:

 Compiling jsp v0.14.0 (/Users/jonathangerber/src/rust/jobsyspolice)
error[E0502]: cannot borrow `np` as immutable because it is also borrowed as mutable
   --> src/
462 |         let iter = np.into_iter();
    |                    -- mutable borrow occurs here
468 |         assert!(np.count() == 0);
    |                 ^^
    |                 |
    |                 immutable borrow occurs here
    |                 mutable borrow later used here

error: aborting due to previous error

The only borrow I have is in the NodePathIntoIterator which should go out of scope after the loop, so why am i getting this? Shouldn’t this be handled by NLL? Also, this even fails if I put the loop in its own scope… What am i missing here?

yikes! am i trying to mix IntoIter and IterMut here? looks like i am. my bad. i guess i should be moving NodePath int NodePathIntoIter, not referencing it… never mind.

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.