gpt4 book ai didi

rust - 没有为 Moved 值调用克隆?

转载 作者:行者123 更新时间:2023-11-29 08:00:01 24 4
gpt4 key购买 nike

我想了解 Copy 如何与 Rust 中的移动语义交互。我希望这个程序能够克隆对象,但事实并非如此。我有 rust 1.0.0-beta。

#[derive(Debug)]                                  
struct X {
y : i32,
}

impl Clone for X {
fn clone(&self) -> X {
println!("clone");
X { y: 4 }
}
}

impl Copy for X { }

fn doit(x : X) {
println!("doit {:?}", x);
}

fn main() {
let z = X { y: 5 };
println!("main {:?}", z);
doit(z);
println!("main {:?}", z);
}

这是我的困惑:如果 X 不是“复制”,doit 将取得对象 z 的所有权并将其丢弃在作用域的末尾。然后, main 中的第二个 println 会提示,因为 z 被移动了。美好的。但是,现在我已将 X 标记为 Copy 并提供了一个克隆方法。我预计克隆方法将用于为 doit 提供它自己的 z 副本,从而允许我在 doit 之后继续使用 z。那不会发生。

我的理解哪里错了?

最佳答案

Clone 没什么特别的。这只是一个普通的图书馆特征。你可以自己定义它!

因此,.clone() 仅在您明确调用它时使用。复制和移动都与 Clone 无关。当您调用 doit(z) 时,z 会在 Copy 意义上进行复制,这意味着在底层进行逐字节复制。如果你想克隆传递给doit,那么写:

doit(z.clone());

关于rust - 没有为 Moved 值调用克隆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29481468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com