• 作为输出参量
    • 参见:

    作为输出参量

    闭包作为输入参量是可能的,所以返回闭包作为输出参量(output parameter)也应该是可能的。然而返回的闭包类型会有问题,因为目前的 Rust 只支持返回具体(非泛型)的类型。按照定义匿名的闭包类型是未知的,所以想要返回一个闭包只有使它变成具体的类型。通过 box 操作可以实现这点。

    关于返回值的有效的 trait 和前面的略有不同:

    • Fn:和前面的一样(normal)
    • FnMut:和前面的一样
    • FnOnce:这里运行会有些独特的地方(There are some unusual things at play here),所以目前需要 FnBox 类型,这属于不稳定的内容。此处预计将来会发生改变。

    除此之外,还必须使用 move 关键字,它表明了通过值来产生全部的捕获(which signals that all captures occur by value)。这是必需的,因为在函数退出的同时任何通过引用捕获的值将被丢弃(dropped),在闭包中留下无效的引用。

    1. fn create_fn() -> Box<Fn()> {
    2. let text = "Fn".to_owned();
    3. Box::new(move || println!("This is a: {}", text))
    4. }
    5. fn create_fnmut() -> Box<FnMut()> {
    6. let text = "FnMut".to_owned();
    7. Box::new(move || println!("This is a: {}", text))
    8. }
    9. fn main() {
    10. let fn_plain = create_fn();
    11. let mut fn_mut = create_fnmut();
    12. fn_plain();
    13. fn_mut();
    14. }

    参见:

    Boxing, Fn, FnMut, 和 泛型.