我如何测试 RAII?

How can I test 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.
}