作者:Hoorxx鹿_416 | 来源:互联网 | 2023-08-30 11:42
我有两个(我希望)等效的功能,例如:
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
or 的一个实例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)
}