为什么在结构分解后会有一个挂断电话?

use*_*932 2 destructuring rust

我包装了C API。为了简化这个问题,我NonNull::dangling改用了。

use std::ptr::NonNull;

struct Foo(NonNull<i32>);

impl Drop for Foo {
    fn drop(&mut self) {
        println!("Foo::drop: {:?}", self.0);
    }
}

struct Moo(NonNull<i32>);
//impl Drop for Moo exists, but not important for question

fn f1() -> Result<Foo, String> {
    Ok(Foo(unsafe { NonNull::dangling() }))
}

fn f2() -> Result<Moo, String> {
    f1().map(|Foo(x)| Moo(x))//1
}

fn main() {
    f2();
}
Run Code Online (Sandbox Code Playgroud)

在第(1)点,我解包/分解Foo。我希望在那之后Foo::drop不应该调用它,但是出于某种原因Foo::drop会打印出来。

销毁(let Struct1 { field1, field2, .. } = struct1;)应该阻止调用,这是我错了Struct1::drop吗?

Tim*_*ann 5

如果NonNull用未实现的结构替换Copy,则行为会更清楚:

#[derive(Debug)]
struct NoCopy;

struct Foo(NoCopy);

impl Drop for Foo {
    fn drop(&mut self) {
        println!("Foo::drop: {:?}", self.0);
    }
}

struct Moo(NoCopy);
//impl Drop for Moo exists, but not important for question

fn f1() -> Result<Foo, String> {
    Ok(Foo(NoCopy))
}

fn f2() -> Result<Moo, String> {
    f1().map(|Foo(x)| Moo(x))//1
}

fn main() {
    f2();
}
Run Code Online (Sandbox Code Playgroud)

这导致此错误:

#[derive(Debug)]
struct NoCopy;

struct Foo(NoCopy);

impl Drop for Foo {
    fn drop(&mut self) {
        println!("Foo::drop: {:?}", self.0);
    }
}

struct Moo(NoCopy);
//impl Drop for Moo exists, but not important for question

fn f1() -> Result<Foo, String> {
    Ok(Foo(NoCopy))
}

fn f2() -> Result<Moo, String> {
    f1().map(|Foo(x)| Moo(x))//1
}

fn main() {
    f2();
}
Run Code Online (Sandbox Code Playgroud)

因此,在(1)你复制NonNullFooFoo被丢弃。