首页 > 解决方案 > 如何创建“FnOnce”函数

问题描述

我正在尝试创建一个只有FnOnce.

以下代码片段不起作用:

// Attempt 1
//  Error doesn't have a size known at compile-time
let f: FnOnce() -> () = || println!("Hello");

// Attempt 2
fn g<T: FnOnce() -> ()>(c: T) -> (FnOnce() -> ()) {
    c
}
// Error: doesn't have a size known at compile-time
let f = g(|| println!("Hello"));

// Attempt 3
// Error: cast to unsized type
let f = (|| println!("Hello")) as (FnOnce() -> ());

标签: functional-programmingrusttraits

解决方案


FnOnce是闭包的一个特征,它只能被调用一次,通常是因为捕获的值被移动到闭包中,并且它们在调用期间被消耗。例如,我们可以捕获一个值并将其作为返回值移出:

fn delay<A: 'static>(a: A) -> Box<dyn FnOnce() -> A> {
    Box::new(move || a)
}

fn main() {
    let a = "hello".to_string();
    let f = delay(a);
    println!("{}", f());
}

请注意,move关键字不是绝对必要的。编译器认为a需要将其移入闭包中,以便作为值返回并移出。


推荐阅读