Syntax 结构更新语法不';我不能处理借来的数据

Syntax 结构更新语法不';我不能处理借来的数据,syntax,rust,Syntax,Rust,我有一个这样的结构,带有一些已解析的参数: struct Args { out: Option<String>, version: bool, help: bool, files: Vec<String>, } 我使用的函数如下所示: fn main() { let args = std::env::args().collect::<Vec<String>>(); let parsed = pars

我有一个这样的结构,带有一些已解析的参数:

struct Args {
    out: Option<String>,
    version: bool,
    help: bool,
    files: Vec<String>,
}
我使用的函数如下所示:

fn main() {
    let args = std::env::args().collect::<Vec<String>>();
    let parsed = parse(&Args::default(), 1, args);
}
而不是:

return parse(&Args { version: true, ..parsed.clone() }, start + 1, args);
以避免在克隆过程中过度复制数据。当我刚刚删除
.clone()
时,它说
Args
类型是预期的,但它得到了
&Args


当我使用
*parsed
解除引用时,编译器会说“不能移出借用的内容”

当类型
T
Clone
时,在
&T
上调用
Clone()
也会返回
T
,因为复制指针没有意义。事实上,如果它确实克隆了底层数据,然后返回了对它的引用,那么您将遇到麻烦,因为
T
将被删除,指针将悬空


要将
&T
转换为
T
,可以使用
*
操作符取消对其的引用。但是,这会给您带来问题,因为
parsed
是由
parse
函数借用的,这意味着它必须在完成后将其返回。如果您取消引用它并移动值,那么您将从借用的上下文中移出。

取消引用不起作用-它说“无法移出借用的内容”。我说过它会这样做!我的观点可能有点偏颇,但这个错误应该告诉你一些事情。您可能需要首先将对象移动到
解析
,而不是传递引用,否则您将陷入克隆的困境。如果我们可以让rust在此处接受借用的引用,这很有趣-我看没有理由不这样做。您想借用引用,然后移动单个字段!例如,一旦您将
文件
向量移动到新的
Args
实例上,则原始实例将不再具有这些文件。即使您的程序不需要它们,Rust也不允许您传递包含空指针的结构。一般来说,你不必太担心克隆的性能——乐观主义者做得相当好,以至于常常与不克隆一样。所以,如果它成为一个问题,就处理它。那么,结构的内部也被认为是借用的,不能仅仅使用?我得到了它。嗯。。。手动内存管理是我15年来从未接触过的东西D谢谢!你考虑过不通过引用传递
解析的
参数吗?@loganfsmyth是的,我就是这样结束的。不克隆的速度提高了7%。
return parse(&Args { version: true, ..parsed }, start + 1, args);
return parse(&Args { version: true, ..parsed.clone() }, start + 1, args);