我有两个(我希望(等价的函数,比如:
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
不是Clone
或Copy
的实例。我可以将其设为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)
}