1个不稳定版本

0.1.0 2020年7月15日

#11#metaprogramming

MIT 许可证

8KB
136

Functionate

此crate提供了一个属性宏,用于为任何struct/enum实现Fn特质,本质上允许您将其用作常规函数/将其作为闭包传递或将其用作重载函数。

(请勿在任何实际项目中使用此功能)

为什么不应该使用这个?

如果您仍然因为必须启用不稳定功能而不被说服,以下是您应该远离此(或任何其他类似模式)的原因

  • 它引入了歧义 - 这段代码做什么?我在哪里找到实现?我为什么调用一个结构体?
  • 它促进了Rust的反模式 - Rust不允许您以经典方式重载函数,这是有原因的。您不应该尝试这样做。

如果您仍然决定在项目中使用此功能 - 我非常抱歉。我希望您不会试图在现实世界中实现此功能。

欢迎提出更多不使用此功能的原因。

示例

#![feature(unboxed_closures, fn_traits, type_alias_impl_trait)]
use functionate::functionate;

#[derive(Debug)]
struct MyFunc {
    state: i32,
}

#[functionate]
impl MyFunc {
    fn get_state(&self) -> i32 {
        self.state
    }

    fn update(&mut self, new: i32) {
        self.state += new;
    }
}

fn main() {
    let mut my_func = MyFunc { state: 5 };
    println!("{}", my_func()); // 5
    my_func(3);
    println!("{}", my_func()); // 8
    my_func(-8);
    println!("{}", my_func()); // 0
}

首先,我们需要启用unboxed_closuresfn_traits功能。一旦我们有了这些,我们就可以在具有方法的impl块上使用#[functionate](所有方法都必须有self&mut self&self参数)。

警告

泛型仅在impl级别上受支持,因此如果您尝试使方法泛型,请预期会发生错误。

异步方法根本不支持(尚不支持)。

依赖项

~1.5MB
~35K SLoC