gpt4 book ai didi

functional-programming - 如何创建 `FnOnce` 函数

转载 作者:行者123 更新时间:2023-11-29 08:17:46 31 4
gpt4 key购买 nike

我正在尝试创建一个只有 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() -> ());

最佳答案

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 需要移入闭包,以便作为值返回并移出。

关于functional-programming - 如何创建 `FnOnce` 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56798106/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com