6 个版本
使用旧的 Rust 2015
0.2.4 | 2018年7月26日 |
---|---|
0.2.3 | 2018年7月25日 |
0.1.0 | 2018年7月19日 |
#2312 in Rust 模式
54 每月下载次数
62KB
1.5K SLoC
使 Rust 闭包类型可命名
此包提供了一些类型和宏,可以创建可命名的闭包类型。
更新
2018-07-25 v0.2.2 添加递归支持(实验性)
使用方法
使用方法,和往常一样,
#[macro_use] extern crate namable_closures;
use namable_closures::Closure;
fn main() {
let add_ten:Closure<i32,(i32,),i32> = closure!(state=10 => move |i| i+*state);
println!("{}",add_ten.stable_call_once(1)); //11
}
该类型有5个变体,每个变体都有3个类型变量。 State
变量对应于闭包的捕获环境。 Input
必须是单元或元组类型,对应于闭包的参数。 Output
是闭包的返回类型。
除了允许您命名闭包类型外,函数体默认不能捕获任何变量,因此所有捕获都必须是明确的。
宏语法 | 结构 |
---|---|
closure!(state=exp=> |x,y| body(x,y,state)) |
闭包 |
closure!(state=exp=> move |x,y| body(x,y,state)) |
ClosureOnce |
closure!(mutstate=exp=> |x,y| body(x,y,state)) |
ClosureMut |
closure!(mutstate=exp=> move |x,y| body(x,y,state)) |
ClosureOnce (带有可变 state ) |
closure!(refstate=exp=> move |x,y| body(x,y,state)) |
ClosureRef |
closure!(ref mutstate=exp=> move |x,y| body(x,y,state)) |
ClosureRefMut |
除非您知道自己在做什么,否则不要使用 Closure
或 ClosureMut
在大多数情况下,您将需要 move
关键字,这将使您的闭包拥有状态。如果您不需要拥有状态,请确保您的状态表达式表示 &T
(对于 Closure
)或 &mut T
(对于 ClosureMut
)类型。
夜间仅功能
定义了一个阴影特性集,用于在 fn_traits
和 unboxed_closures
功能稳定之前使用。使用它们有些丑陋。
let myclosure:Closure<i32,(),i32> = closure!(s=&0 => || *s);
fn1_expect_closure(||myclosure.stable_call());
let myclosure:ClosureRef<(),(i32,),i32> = closure!(s=&() => |i| i);
fn2_expect_closure(|i|myclosure.stable_call((i,)));
let myclosure:ClosureRef<(),(i32,i32),i32> = closure!(s=&() => |i,j| i+j);
fn3_expect_closure(|i,j|myclosure.stable_call((i,j)));
如果您不介意在夜间 Rust 中进行编译,可以将以下内容添加到 cargo.toml
[dependencies.namable_closures]
features = ["nightly"]
现在您可以编写以下内容
let myclosure:Closure<i32,(),i32> = closure!(s=&0 => || *s);
fn1_expect_closure(||myclosure());
let myclosure:ClosureRef<(),(i32,),i32> = closure!(s=&() => |i| i);
fn2_expect_closure(|i|myclosure(i));
let myclosure:ClosureRef<(),(i32,i32),i32> = closure!(s=&() => |i,j| i+j);
fn3_expect_closure(myclosure);