如何在 rust 中编写"non-assert"调试代码



我有两个(我希望(等价的函数,比如:

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

您可以将条件编译与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)
}

最新更新