I have a struct like this with some parsed arguments:
struct Args {
out: Option<String>,
version: bool,
help: bool,
files: Vec<String>,
}
I want to recursively parse a list, returning a new modified Args struct every time I need to modify it:
fn parse(parsed: &Args, start: usize, args: Vec<String>) -> Args {
if start >= args.len() {
return parsed.clone();
}
if args[start] == "--version" {
return parse(&Args { version: true, ..parsed.clone() }, start + 1, args);
}
if args[start] == "--help" {
return parse(&Args { help: true, ..parsed.clone() }, start + 1, args);
}
return Args { files: args[start..args.len()].to_vec(), ..parsed.clone() };
}
I use the function like this:
fn main() {
let args = std::env::args().collect::<Vec<String>>();
let parsed = parse(&Args::default(), 1, args);
}
This code works, but I would like to type:
return parse(&Args { version: true, ..parsed }, start + 1, args);
instead of:
return parse(&Args { version: true, ..parsed.clone() }, start + 1, args);
to avoid excessive data copying during cloning. When I just remove .clone() it says that Args type expected but it got &Args instead.
When I dereference with *parsed compiler says "cannot move out of borrowed content"
parsedargument by reference? - loganfsmyth