如何在 Rust 中编写“非断言”调试代码

4

我有两个(希望是等效的)函数,类似于:

fn slow_summary(foo: &Foo) -> Bar
fn fast_summary(foo: Foo) -> Bar

我想在快速摘要的调用点添加一个debug_assert语句,以确保其结果与慢速摘要相同。例如:
fn bar(foo: Foo) -> Baz {
  let summary = fast_summary(foo);
  debug_assert_eq!(summary, slow_summary(&foo));
  baz(summary)
}

但是我不能这样做,因为foo已经被调用 fast_summary 消耗了(Foo 不是 CloneCopy 的实例。 我可以使它成为 Clone 然后进行 clone,但这仍然会引入不必要的运行时债务,并且也使代码看起来更难看)。理想情况下,我应该首先调用 slow_summary,再调用 fast_summary,但是如何在确保只有在开启调试断言时才调用 slow_summary 的情况下实现呢?

1个回答

6

您可以使用 条件编译 并设置 debug_assertions 条件:

fn bar(foo: Foo) -> Baz {
    let calculated_slow_summary: Bar;
    #[cfg(debug_assertions)]
    {
        calculated_slow_summary = slow_summary(&foo);   
    }
    let summary = fast_summary(foo);
    debug_assert_eq!(summary, calculated_slow_summary);
    baz(summary)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接