【发布时间】:2017-07-02 18:30:34
【问题描述】:
我有一个这样的结构,带有一些已解析的参数:
struct Args {
out: Option<String>,
version: bool,
help: bool,
files: Vec<String>,
}
我想递归解析一个列表,每次需要修改时返回一个新修改的Args结构:
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() };
}
我使用这样的函数:
fn main() {
let args = std::env::args().collect::<Vec<String>>();
let parsed = parse(&Args::default(), 1, args);
}
此代码有效,但我想输入:
return parse(&Args { version: true, ..parsed }, start + 1, args);
代替:
return parse(&Args { version: true, ..parsed.clone() }, start + 1, args);
避免在克隆过程中复制过多的数据。当我删除 .clone() 时,它说应该是 Args 类型,但它却得到了 &Args。
当我取消引用 *parsed 时,编译器说“无法移出借用的内容”
【问题讨论】:
-
您是否考虑过不通过引用传递
parsed参数? -
@loganfsmyth 是的,我就是这样结束的。我得到的不克隆的速度增益约为 7%。