-1

我正在使用 proptest crate 在 no_std 环境中运行一些属性测试。proptest 的默认test_runner::TestRunner::run()实现采用一些输入(作为proptest 中定义StrategyValueTree对象)和函数闭包作为参数,因此您可以使用值树或策略中的值运行任意数量的测试。

我需要测试一个函数调用,该函数调用将可变借用的结构作为参数。这不会编译:

error[E0596]: cannot borrow `*<obj>` as mutable, as it is a captured variable in a 'Fn' closure

obj是通过函数调用传递给test_runner上一级的结构,作为可变借用对象。

深入研究 proptest 的源代码,很明显编译错误是由于函数签名引起的test_runner::TestRunner::run()

pub fn run<S: Strategy>(
    &mut self,
    strategy: &S,
    test: impl Fn(S::Value) -> TestCaseResult,
) -> TestRunResult<S>

该参数需要FnMut使捕获的变量在函数调用中是可变的。我的问题是:有没有一种惯用的 rust 方式来做到这一点?

这是从条件编译的运行函数传递的函数:

fn test_mod(runner: &mut TestRunner, obj: &mut MyObjStruct) -> Result<(), TestError(u32)>>{
    runner.run(&(0x400_0000u32..0xe00_0000u32), |addr| {
        if mod::test::test_page_map(addr, obj).is_ok() {
            Ok(())
        } else {
            Err(TestCaseError::fail(Reason::from("Failed to map address")))
        }
    })
}

mod::test::test_page_map获取obj,使用结构中的相关元数据,相应地更新该数据,并将页面映射到输入地址。它根据映射是否成功返回结果。值得注意的是,我无法克隆该对象。

有没有人看到符合“Rust 方式”的解决这个问题的方法?在 no_std 领域中是否有一些可用的机制,Cell或者我可以用它来包装可变对象,使其具有内部可变性但可以作为捕获的变量传递给“Fn”闭包?我对 Rust 很陌生,所以不确定通常如何处理这种事情。

4

1 回答 1

0

找到了一个可行的答案,尽管可能还有其他答案。我发现的作品是用来core::cell::RefCell::new(obj)包装对象。然后通过调用提供的方法将RefCell-wrapped 对象作为可变借用传递给函数borrow_mut()RefCell

于 2019-08-01T15:18:42.893 回答