#闭包 #子句 #

捕获

用于向(闭包)表达式添加显式捕获子句的宏

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2014年11月28日

2549Rust 模式

MIT 许可证

5KB

capture.rs

Travis-CI Status

用于向(闭包)表达式添加显式捕获子句的宏。

使用此宏,可以明确指定闭包捕获哪些变量,以及通过哪种捕获模式进行捕获。

语法

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);
}

无运行时依赖