Rust 如何测试RAII?

Rust 如何测试RAII?,rust,raii,Rust,Raii,我目前正在尝试在Rust中测试一些RAII代码,我想延迟删除一个值,直到特定的代码行 在C#中,GC.KeepAlive防止对象在调用GC.KeepAlive之前被垃圾收集。从应用程序的角度来看,该方法本质上是一个no-op,但它保证在代码流中的特定点之前对对象的有效引用。它主要用于测试 有没有一种惯用的方法来延迟一个值的下降直到生锈的某个点?我正在尝试测试一些RAII代码,我更喜欢使用一种其他程序员可以识别的约定 例如: 让foo=some_func(); //强制释放foo //这行代码做了

我目前正在尝试在Rust中测试一些RAII代码,我想延迟删除一个值,直到特定的代码行

在C#中,GC.KeepAlive防止对象在调用GC.KeepAlive之前被垃圾收集。从应用程序的角度来看,该方法本质上是一个no-op,但它保证在代码流中的特定点之前对对象的有效引用。它主要用于测试

有没有一种惯用的方法来延迟一个值的下降直到生锈的某个点?我正在尝试测试一些RAII代码,我更喜欢使用一种其他程序员可以识别的约定

例如:

让foo=some_func();
//强制释放foo
//这行代码做了一些事情,如果foo还活着,它将无法通过测试
some_other_func();

最简单的方法是显式删除对象。调用
mem::drop
时,对象将被移动到该函数中,因此该对象必须在该点之前而不是之后存在于调用方中。这向其他锈迹开发者发出信号,表明您明确希望在那个时候销毁。它不一定表明为什么要在那个里销毁,所以若从上下文看不明显,你们可能仍然需要一个注释

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

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.
}

也许这是一个答案,但一个更具体的例子,也许只需要一个最小的代码片段,将非常有帮助。如果您熟悉RAII,Rust的析构函数等价物就是trait,它在作用域末尾运行
.drop()
。你可以用它来立即扔东西,也可以永远不扔。不过,不清楚改变掉的行为如何有助于测试。Rust中从来没有垃圾收集过任何东西,因此您不需要对它进行注释。我能想到的唯一一种相邻的东西是
mem::forget
,但我不确定这就是你想要的。一个具体的例子会有所帮助。我不认为没有具体的例子就可以重新打开,但根据评论和(被接受的)答案,它可能是的副本。@AndrewRondeau这正是为什么它应该被标记为副本的原因:这样人们在将来搜索你使用的相同关键字时,将找到副本并指向相同的(希望是规范的和最新的)信息源。由于这个原因,标记为重复的问题永远不会被删除。如果从这个函数中删除
drop(tempdir)
,结果并不是像OP对
KeepAlive
的描述所建议的那样,
tempdir
可能会被更早地删除,而是它会在以后(当它超出范围时)被删除。@trentcl:when drop(tempdir)如果删除,则行为是立即删除目录。(直到作用域结束时才保留。)Rust编译器在最后一次使用后删除tempdir,而不是在作用域结束时。@AndrewRondeau您错了。删除
drop(tempdir)
并且仅此示例中的该行将导致目录在超出范围之前不会被删除。您可能想到了一些您没有共享的稍有不同的代码。@trentcl:您是对的。我刚刚在我的一个测试中注释掉了一点,它通过了。一定是对我在尝试生锈和烧焦时遇到的问题感到困惑。