#boolean #macro #proc-macro

negate

属性宏,用于生成返回布尔值的函数的否定版本

2 个版本

0.1.1 2021 年 9 月 4 日
0.1.0 2021 年 9 月 4 日

1827Rust 模式

MIT 许可证

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