#closures #create #macro #type #extern #nightly #namable

namable_closures

提供创建可命名闭包类型的类型和宏

6 个版本

使用旧的 Rust 2015

0.2.4 2018年7月26日
0.2.3 2018年7月25日
0.1.0 2018年7月19日

#2312 in Rust 模式

Download history 54/week @ 2024-07-27

54 每月下载次数

MIT 许可证

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

除非您知道自己在做什么,否则不要使用 ClosureClosureMut

在大多数情况下,您将需要 move 关键字,这将使您的闭包拥有状态。如果您不需要拥有状态,请确保您的状态表达式表示 &T(对于 Closure)或 &mut T(对于 ClosureMut)类型。

夜间仅功能

定义了一个阴影特性集,用于在 fn_traitsunboxed_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);

无运行时依赖项

功能