1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2014年11月28日 |
---|
2549 在 Rust 模式
5KB
capture.rs
用于向(闭包)表达式添加显式捕获子句的宏。
使用此宏,可以明确指定闭包捕获哪些变量,以及通过哪种捕获模式进行捕获。
语法
capture!($([move IDENT,]
[ref IDENT,]
[IDENT IDENT,])*
in EXPR)
语义
该宏将展开为嵌套块表达式,每个捕获子句都有一个 let
绑定
move x
子句通过自身重新绑定名称,实际上是一个无操作。ref x
子句通过共享引用重新绑定名称。ref mut x
子句通过可变引用重新绑定名称。IDENT x
子句通过调用它上的.IDENT()
方法重新绑定名称。例如,这可以用来通过 clone 进行捕获,如下所示:clone x
。
这些绑定将适用于最终的 EXPR
表达式,这通常是一个按值捕获的闭包。
当前限制和未来更改
- 宏语法有些啰嗦。此包的未来版本可能会使用表达式属性来变得更加轻量。
- 该宏可能会变得更加专业化,总是生成按值捕获的闭包,而不是允许任意表达式。
示例
使用宏
#![feature(phase)]
#![feature(unboxed_closures)]
#[phase(plugin)]
extern crate capture;
fn main() {
let (x, y, z) = (1u32, 2u32, 3u32);
let g = capture!(move x, ref y, clone z in move |:| x + *y + z);
assert_eq!(g(), 6);
}