我有一些测试,其中包含一些保存一些重要数据的变量,我想在断言失败时打印它们的数据。获取所需的数据会消耗变量,因此打印代码必须拥有这些变量。在本例中,我希望在断言失败时调用dump_foo_data
:
struct Foo(); fn dump_foo_data(f: Foo) { eprintln!("Behold, Foo data: "); } #[test] fn my_test() { let f = Foo(); eprintln!("begin"); // do a test &f; let success = true; assert!(success); // do another test &f; let success = false; assert!(success); }
我可以通过使dump_foo_data
不返回和恐慌来做出非常糟糕的解决方案:
fn dump_foo_data(f: Foo) -> ! { eprintln!("Behold, Foo data: "); panic!(); }
然后,我没有使用assert!
,而是使用if
检查失败,并可能调用dump_foo_data
:
let success = true; if !success { dump_foo_data(f); }
这是太多的代码行,我需要指定f
。实际上,我有不止一个像f
这样的变量需要从中转储数据,所以在每次检查中列出一个相关的局部变量不是很好。
我想不出如何编写一个宏来使其更好,因为我仍然需要将每个相关的局部变量传递给宏。
我也想不出使用std::panic
的方法update_hook
需要取得f
的所有权,然后我无法在测试中使用它。
在Rust有什么好办法吗?