#variables #explicit #checking #implicit #behavior #check #ignoring

无关

一个用于更明确地忽略变量并检查关于这些变量的假设的Rust包。

1 个不稳定版本

0.1.0 2024年4月2日

#9 in #implicit

MIT 许可证

15KB
127

什么是 irrelevant

irrelevant 是一个Rust包,旨在使忽略变量更加明确。

解决的问题

有时,你会忽略一个变量,因为它似乎你不需要它。例如,你可能假设一个类型为 DrinkDish 从不会带有酱料,因此你忽略了订单的这个字段。这是关于程序行为的 隐含 假设,并且可能不会立即清楚 为什么 酱料被忽略。

// Why are sauces ignored?
let _ = sauces;

这个包允许你指定为什么会发生这种情况,并检查这个假设。

irrelevant!(sauces,"No sauces should come with a drink!",sauces.is_empty());
// Shorthand version supported too!
irrelevant!(sauces,"No sauces should come with a drink!",is_empty);

这些检查允许你将隐含的假设明确化。这样,如果你以违反假设的方式更改代码,将会记录错误信息。这可以防止你意外违反关于代码的假设。

irrelevant 还允许你检查你忽略的类型。一个参数可能在某个时刻不重要,但之后可能变得重要。

/// Implements the + operator in an interpreted language
fn add_numbers(a:u32,b:u32,context:&PremisionSet)->u32{
    irrelevant!(context,"Adding numbers does not require any privileges.",&PremisionSet);
    return a + b;
}

例如,在实现一个解释型语言的某些操作时

use irrelevant::*;
/// Implements + operator in an interpreted language
fn add_numbers(a:u32,b:u32,context:&(PremisionSet,AutomaticProfiler))->u32{
    // Will not compile, because the type has changed, and the value may have become relevant.
    irrelevant!(context,"Adding numbers does not require any privileges.",&PremisionSet);
    return a + b;
}

当前的 context 可能被忽略,因为加法是一个非特权操作。但如果我们为解释器添加了性能分析,忽略上下文就不再合适了。

这个变化将在编译时被捕获并报告为错误。

irrelevant!(sauces,"No sauces should come with a drink!",sauces.is_empty());
// `sauces` has been ignored, so this variable can't be used here! 
for sauce in sauces{
    // ...
}

宏的变体。

宏有3个变体

  1. irrelevant - 总是记录错误
  2. debug_irrelevant - 如果内置调试则记录错误
  3. panic_irrelevant - 总是在错误时崩溃

许可证

这个包同时受MIT许可证和Apache许可证版本2.0的许可。

无运行时依赖