代码之家  ›  专栏  ›  技术社区  ›  dspyz

如何在rust中编写“非断言”调试代码

  •  0
  • dspyz  · 技术社区  · 4 年前

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

    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 但这仍然会带来不必要的运行时债务,也会让代码看起来更难看)。理想情况下,我会打电话 slow_summary 第一 然后 呼叫 快速汇总 ,但在确保 慢_摘要 仅在调试断言打开时调用?

    1 回复  |  直到 4 年前
        1
  •  5
  •   Aplet123    4 年前

    你可以用 conditional compilation 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)
    }