将 Option 实例从 Some 设置为 None 是否会触发删除内部值?

Gal*_*axy 6 rust

我有代码:

struct Foo {}

impl Default for Foo {
    fn default() -> Self {
        Self {}
    }
}

impl Drop for Foo {
    fn drop(&mut self) {
        // Do something
    }
}

fn main() {
    {
        let foo = Some(Foo::default());
        let foo = None; // Would this line trigger `Foo::drop`?
    };
    {
        let mut foo = Some(Foo::default());
        foo = None; // Would this line trigger `Foo::drop`?
    };
}
Run Code Online (Sandbox Code Playgroud)

s占用的资源是否得到foo正确释放?

第一种情况(变量被覆盖)不会触发drop,所以我添加了第二种情况,我也很困惑。

Jan*_*dec 6

let foo = Some(Foo::default());
let foo = None; // Would this line trigger `Foo::drop`?
Run Code Online (Sandbox Code Playgroud)

不,块的末尾会。

请记住,这let是一个变量声明,因此第二行不会修改第一行foo,而是创建一个新的变量foo来隐藏前一行。但它仍然存在(如果您在第二个之前创建了对它的引用,则可以访问它let)直到块末尾,因此它将在块末尾被删除。

如果你想实际改变变量,你必须这样做

let mut foo = Some(Foo::default());
foo = None;
Run Code Online (Sandbox Code Playgroud)

现在它将立即触发删除,因为旧值正在被覆盖,所以它必须删除它。