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吗?
如果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)你复制NonNull出Foo和Foo被丢弃。