Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Use `&mut Option<PathBuf>` on each iteration of loop

I have a situation where I have an Option<PathBuf> and I want to pass a mutable reference to it to a function (do_loop) and within that function it is passed to a second function (handle_path) within in each iteration of a loop. The second function also possibily calls the first function (so this is recursive).
I have attempted to create minimal example from my codebase which hopefully better illustrates what I am trying to achieve. I have tried using &mut Option<PathBuf>, &Option<&mut PathBuf>, and Option<&mut PathBuf> but none have worked. I could solve the problem by cloning the PathBuf at some point but I am hoping to avoid this in order to improve the performance and memory usage.

use std::path::PathBuf;

fn handle_path(path: &mut Option<PathBuf>) {
    match path {
        Some(path) => {
            let check = path.pop();
            if check {
                do_loop(Some(*path));
            }
        }
        None => {}
    }
}

fn do_loop(path: &mut Option<PathBuf>) {
    for i in 0..2 {
        handle_path(path);
    }
}
fn main() {
    do_loop(&mut Some("foo/bar".into()));
    do_loop(&mut None);
}

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

While destructuring the option, you reused the same variable name (path), thus your parameter (still holding the modified path) is not useable anymore (this is called shadowing a variable).
Choosing another name in the pattern matching allows you to pass the same parameter to the recursive call.

fn handle_path(path: &mut Option<PathBuf>) {
    match path {
        Some(inner_path) => {
            let check = inner_path.pop();
            if check {
                do_loop(path);
            }
        }
        None => {}
    }
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading