问题描述
我目前正在尝试在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.
}