1个不稳定版本
0.1.0 | 2020年7月15日 |
---|
#11 在 #metaprogramming
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_closures
和fn_traits
功能。一旦我们有了这些,我们就可以在具有方法的impl
块上使用#[functionate]
(所有方法都必须有self
、&mut self
或&self
参数)。
警告
泛型仅在impl
级别上受支持,因此如果您尝试使方法泛型,请预期会发生错误。
异步方法根本不支持(尚不支持)。
依赖项
~1.5MB
~35K SLoC