如何在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不是Cloneor 的一个实例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)
}


以上是如何在Rust中编写“非断言”调试代码的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>