functional-programming - 如何创建“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() -> ());
解决方案
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
需要将其移入闭包中,以便作为值返回并移出。
推荐阅读
- c++ - 如何添加或减去数组的一部分?
- javascript - 如何在javascript中计算变量并在html页面中打印它们
- firebase - 如何通过云功能访问实时数据库的深层价值?
- javascript - 如何将两种材质添加到已经在画布上渲染的网格中
- npm-install - 为什么会这样?谁能给我答案
- string - 从几个下拉列表中创建一个组合文件名
- mysql - 直接在 MYSQL 中建立左表和右表之间的关系是一种好习惯吗?
- sqlite - SQLite - 根据修改日期合并 2 个表,必要时插入新行
- php - 尝试在 php CRUD 应用程序中执行准备好的语句失败
- jquery - 我无法阻止 Chrome 中的鼠标滚轮事件