我是 Rust 新手,我想验证是否clone()需要关闭move。
我定义了一种类型Test并实现了该Clone特征:
struct Test {
b : bool,
}
impl Clone for Test {
fn clone(&self) -> Self {
println!("clone called");
*self
}
}
impl Copy for Test {
}
Run Code Online (Sandbox Code Playgroud)
然后我在move闭包中使用它:
let test = Test{b:true};
println!("Memory address of test: {:?}", std::ptr::addr_of!(test.b));
let c = move || { println!("Memory address of test: {:?}", std::ptr::addr_of!(test.b)); };
c(); // <--- does clone() be called here?
println!("Memory address of test: {:?}", std::ptr::addr_of!(test.b));
Run Code Online (Sandbox Code Playgroud)
我期待c(),"clone called"将被打印,但它没有。
为什么?Clone()是不是叫?
输出如下:
> Memory address of test: 0xdf46ddfa9f
> Memory address of test: 0xdf46ddfaef
> Memory address of test: 0xdf46ddfa9f
Run Code Online (Sandbox Code Playgroud)
地址改变意味着test被复制或克隆。
在这种情况下,如何验证何时clone()被调用?
闭包永远move不会调用。任何克隆都必须明确地进行。clone()
您所看到的是,它test被移动到闭包中,这通常对您的最后一个来说是一个问题println!,但是因为您的类型实现了,所以会创建Copy一个副本并将其移动到闭包中。每当移动一个Copy类型时,它实际上就被复制了。
由于Copy用户不可定义且隐式使用,因此在其实现中添加逻辑通常不是一个好主意Clone。定义Copy类型的惯用方法是使用派生宏:#[derive(Copy, Clone)] struct Test { ...。
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |