如何测试RAII?

问题描述

我目前正在尝试在Rust中测试一些RAII代码,我想将删除值的时间推迟到特定的代码行为止。

在C#中,直到调用GC.KeepAlive之后,GC.KeepAlive才阻止对象被垃圾回收。从应用程序的角度来看,该方法本质上是禁止操作的,但是它可以保证对对象的有效引用,直到代码流中的特定点为止。它对测试最有用。

是否有一种惯用的方法来延迟删除值直到Rust中的某个点?我正在尝试测试一些RAII代码,并且我希望使用其他Rust程序员可以识别的约定。

例如:

let foo = some_func();

// Force foo to be deallocated

// This line does something that,if foo were still alive,it would fail the test
some_other_func();

解决方法

最简单的方法是显式删除对象。当您调用mem::drop时,该对象将移入该函数,因此该对象必须在该点之前而不是该点之后存在于调用程序中。这向其他Rust开发人员发出信号,表明您当时明确想要销毁。它不一定表示您要在其中销毁的原因,因此,如果从上下文中看不出来,您可能仍需要注释。

例如,如果您有一个临时目录并需要保留它:

extern crate tempfile;

fn do_something() {
    let tempdir = tempfile::TempDir::new();

    // Do some things with your temporary directory.

    std::mem::drop(tempdir);

    // Do some things without your temporary directory.
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...