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);