如何在 Rust 中编写 "non-assert" 调试代码
How to write "non-assert" debugging code in rust
我有两个(我希望)等价的功能,例如:
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
条件下使用 conditional compilation:
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)
}
我有两个(我希望)等价的功能,例如:
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
条件下使用 conditional compilation:
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)
}