首页 > 解决方案 > 如何使结构接受类型 `impl std::ops::Fn<()>` 作为其字段?

问题描述

在 Rust 1.26 中,一个名为 impl Trait 的新特性得到了稳定,它使函数能够返回一个未装箱的闭包。但是如何为未装箱的闭包定义结构字段的类型,下面的代码无法编译:

fn return_closure() -> impl Fn() -> () {
    move || {
        println!("abc");
    }
}

struct HoldClosure {
    closure: impl Fn() -> ()
}

fn main() {    
    let hold_my_closure = HoldClosure {
        closure: return_closure()
    };
}

标签: rust

解决方案


只需使用泛型类型参数。

fn return_closure() -> impl Fn() {
    move || {
        println!("abc");
    }
}

struct HoldClosure<F: Fn()> {
    closure: F,
}

fn main() {    
    let hold_my_closure = HoldClosure {
        closure: return_closure()
    };

    (hold_my_closure.closure)();
}

推荐阅读