2 个版本
0.1.1 | 2021 年 9 月 4 日 |
---|---|
0.1.0 | 2021 年 9 月 4 日 |
1827 在 Rust 模式
21KB
270 行
negate
negate 是一个简单的属性宏,用于否定给定的函数。
用法
#[negate]
给定一个形式为 is_*
返回布尔值的函数,该宏将创建一个 is_not_*
函数,该函数否定给定的函数。
struct Word(&'static str);
impl Word {
pub fn new(word: &'static str) -> Self {
Self (word)
}
#[negate] // <- negate will implement a `is_not_uppercase` function!
pub fn is_uppercase(&self) -> bool {
self.0 == self.0.to_uppercase()
}
}
let my_name = Word::new("My Name");
assert!(my_name.is_not_uppercase());
#[negate(名称= "...")]
使用名称属性允许您设置生成函数的名称。这也允许使用 [negate] 宏与不以 is_
开头的函数一起使用。
use negate::negate;
pub enum TaskState {
Ready,
Finished,
}
pub struct Reactor {
tasks: HashMap<usize, TaskState>,
}
impl Reactor {
// Generates the `is_finished` function
#[negate(name = "is_finished")]
pub fn is_ready(&self, id: usize) -> bool {
self.tasks.get(&id).map(|state| match state {
TaskState::Ready => true,
_ => false,
}).unwrap_or(false)
}
}
#[negate(文档= "...")]
使用文档属性允许您自定义生成函数的文档字符串。
use negate::negate;
#[negate(name = "is_odd", docs = "returns true if the given number is odd")]
fn is_even(x: i32) -> bool {
x % 2 == 0
}
assert!(is_odd(5));
生成的代码看起来像什么样子?
非关联函数
#[negate]
pub fn is_even(x: i32) -> bool {
x % 2 == 0
}
将扩展为
pub fn is_even(x: i32) -> bool {
x % 2 == 0
}
/// This is an automatically generated function that denies [`is_even`].
/// Consult the original function for more information.
pub fn is_not_even(x: i32) -> bool {
!is_even(x)
}
使用泛型同样不是问题
#[negate]
fn is_equal<T>(x: T, y: T) -> bool
where
T: Eq,
{
x == y
}
生成的否定函数
/// This is an automatically generated function that denies [`is_equal`].
/// Consult the original function for more information.
fn is_not_equal<T>(x: T, y: T) -> bool
where
T: Eq,
{
!is_equal(x, y)
}
关联函数
struct BigInt {
..
};
impl BigInt {
#[negate(name = "is_negative", docs = "Returns true if the number is negative and false if the number is zero or positive.")]
pub fn is_positive(&self) -> bool { .. }
}
变为
impl BigInt {
pub fn is_positive(&self) -> bool { .. }
/// Returns true if the number is negative and false if the number is zero or positive.
pub fn is_negative(&self) -> bool {
!self.is_positive()
}
}
依赖
~1.5MB
~36K SLoC