如何验证是否在“move”闭包中调用了clone()?

Fel*_* Xu 0 rust

我是 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()被调用?

kmd*_*eko 8

闭包永远move不会调用。任何克隆都必须明确地进行。clone()

您所看到的是,它test移动到闭包中,这通常对您的最后一个来说是一个问题println!,但是因为您的类型实现了,所以会创建Copy一个副本并将其移动到闭包中。每当移动一个Copy类型时,它实际上就被复制了

由于Copy用户不可定义且隐式使用,因此在其实现中添加逻辑通常不是一个好主意Clone。定义Copy类型的惯用方法是使用派生宏:#[derive(Copy, Clone)] struct Test { ...