#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)
}