1 个不稳定版本
0.1.0 | 2024年4月2日 |
---|
#9 in #implicit
15KB
127 行
什么是 irrelevant
irrelevant
是一个Rust包,旨在使忽略变量更加明确。
解决的问题
有时,你会忽略一个变量,因为它似乎你不需要它。例如,你可能假设一个类型为 Drink
的 Dish
从不会带有酱料,因此你忽略了订单的这个字段。这是关于程序行为的 隐含 假设,并且可能不会立即清楚 为什么 酱料被忽略。
// 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个变体
irrelevant
- 总是记录错误debug_irrelevant
- 如果内置调试则记录错误panic_irrelevant
- 总是在错误时崩溃
许可证
这个包同时受MIT许可证和Apache许可证版本2.0的许可。