当前位置: 首页 > 知识库问答 >
问题:

是否设置选项实例从一些到无触发删除内部值?

董俊
2023-03-14

我有密码:

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`?
    };
}

foos占用的资源是否得到适当释放?

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

共有2个答案

董品
2023-03-14

除非您明确地将变量名记为,否则当作用域结束时,它将被删除。

在您的情况下,当相关范围结束时,变量将被释放。

因为您显式地实现了Drop的特性。它将覆盖drop行为并调用您的drop函数:

fn main() {
    let _: Option<Foo> = Some(Foo::default()); // Since variable name is '_' it will be dropped automatically.

    {
        let foo: Option<Foo> = Some(Foo::default());
        let foo: Option<Foo> = None;
        println!("Inner Scope Finishing. Going to drop inner scope variables.");
    } // Inner scope is finished dropping the inner scope variables.

    let main_foo: Option<Foo> = Some(Foo::default());
    let main_foo: Option<Foo> = None;
    println!("Main Scope Finishing. Going to drop main scope variables.");
} // Main is finished dropping the main scope variables

操场上展示的行为。

张鸿宝
2023-03-14
let foo = Some(Foo::default());
let foo = None; // Would this line trigger `Foo::drop`?

不,街区的尽头会。

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

如果你真的想改变变量,你必须这样做

let mut foo = Some(Foo::default());
foo = None;

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

 类似资料:
  • 我正在寻找某种方法,使一些@BeforeMethod逻辑只为一组java单元测试执行(使用testng)。因此,我继续了testng文档,发现了以下内容:

  • 我有一个数组像 现在我要移除cartItem对象中的一个产品。我试过这个方法,但是更新后它也把原来的cartitem弄得一塌糊涂。 最后,原始的cartItem对象也没有显示任何东西。 我想要的是从products数组中移除一个产品,并发送回剩余的数组。

  • 问题内容: 范围:两个表。创建新的顾客时,他们会将有关他们的一些信息存储到第二张表中(这也使用触发器完成,它可以按预期工作)。这是我的表结构和关系的示例。 表1-> 顾客 表2-> patron_info 管理员可以管理顾客。当他们选择移走顾客时,将顾客从 桌子1 移开。此时, 表2 没有任何反应。 我只是想创建一个触发器,以便在表1的项目已删除时从表2中删除。这是我尝试过的… 最初,我尝试删除触

  • 问题内容: 谁能告诉我从我删除所选项目的简便方法? 我在Google和此处进行了搜索,但发现了很多方法。我应该使用哪种方式? 问题答案: 正如@Andreas_D所说,以数据为中心,更抽象的ListModel是解决方案。这可以是DefaultListModel。您应该在JList中显式设置模型。所以(感谢@kleopatra发表评论): DefaultListModel中有几种方法。 顺便说一句,

  • 问题内容: 这在Microsoft SQL Server的T-SQL上是有效的语法,但在SQLite中则无效,在SQLite中是否有相同的替代语法? 问题答案: 通常,将整个联接移到一个子查询中,该子查询查找要删除的行的主键: 如果您有复合主键,则可以使用rowid代替: 如果您有复合主键,并且将该表创建为WITHOUT ROWID 表,则必须将联接重写为相关子查询:

  • 我正在尝试从JList中删除选定的元素。我知道怎么去掉一个 然而;有办法删除我选择的索引吗?我知道这个功能 返回一个Int数组。我想,如果我遍历它以移除索引,它应该会起作用,但是,我会从中得到错误(假设是因为索引#正在下降)。