Как написать отладочный код «без утверждения» в rust

#debugging #rust #assertion

#отладка #Ржавчина #утверждение

Вопрос:

У меня есть две (я надеюсь) эквивалентные функции, такие как:

 fn slow_summary(foo: amp;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(amp;foo));
  baz(summary)
}
 

Но я не могу этого сделать, потому foo что он уже был использован вызовом to fast_summary ( Foo не является экземпляром Clone or Copy . Я мог бы сделать это Clone , а затем clone это, но это все равно приводит к ненужным затратам времени выполнения, а также делает код более уродливым). В идеале я бы slow_summary сначала позвонил. А затем вызовите fast_summary , но как мне это сделать, при этом убедившись slow_summary , что вызывается только при включении debug-assertions ?

Ответ №1:

Вы можете использовать условную компиляцию с debug_assertions условием:

 fn bar(foo: Foo) -> Baz {
    let calculated_slow_summary: Bar;
    #[cfg(debug_assertions)]
    {
        calculated_slow_summary = slow_summary(amp;foo);   
    }
    let summary = fast_summary(foo);
    debug_assert_eq!(summary, calculated_slow_summary);
    baz(summary)
}