#assertions #assets #trace-logging

不变量

基于正常和不变量的断言

4次发布

0.1.3 2023年3月21日
0.1.2 2022年12月13日
0.1.1 2022年5月30日
0.1.0 2022年5月18日

调试类别中排名第421

每月下载量22

MIT许可MIT

13KB
128 代码行

Rust-Invariants

这是什么?

这是一个带有断言宏的库,用于控制某些断言何时被编译或运行。这使得在测试期间,即使代码中充满了许多debug_assertions,也不会对性能造成巨大影响。因此,您可以使用跟踪断言tassert!(true),它只有在您启用跟踪断言时才会编译为检查。

动机

在任何语言中,尤其是在Rust中,调试可能会有些痛苦。编写特殊的调试打印可能会弄脏您的代码并使其更难维护,而每次都要重新进行调试工作是非常昂贵的。因此,我们通常会有一些有意义的日志打印,也许还有这里或那里的断言。

我开始改变我的工作方式,我称之为“不变量调试”。除了日志记录之外,而不是调试表达式(据我所知,在Rust中这是不可能的),我使用断言。您在开发期间定义不变量,然后您可以使用断言来检查它们。这样,它既用于测试也用于文档。例如,在一个hashset实现中,您可以添加以下断言

pub fn add(key) {
    ...
    let res = self.data.insert(key, value);
    debug_assert!({
        let mut set = vec![];
        for e in v.iter() {
            if !set.contains(e) {
                set.push(0);
            }
        }
        set.len() == self.len()
            }, "HashSet has a non-unique key");
    res
}

这不是检查重复的有效方法。而且更糟糕的是,我们的某些测试会非常慢。通常我们会在修复了我们的错误后注释掉或删除这个断言,但仍然是一个好主意。相反,当使用这个宏时,您可以使用tassert!,这样您就会得到类似的代码片段

pub fn add(key) {
    ...
    let res = self.data.insert(key, value);
    tassert!({...}, "HashSet has a non-unique key");
    res
}

但这样,您可以在某些路径或某些测试中只打开跟踪断言。

如何使用它?

 iassert!(true, "This is always true");
 wassert!(true, "This is always true");
 tassert!(false, "Opps, this doesn't work when used in trace level");

目前,我们仅支持使用日志级别作为断言级别。在不久的将来,我们将添加对自定义断言级别、动态断言级别以及使用过程宏定义断言函数等其他优秀特性的支持。

安装

[dependencies]
assertions = "0.1"

依赖项

~87KB