Functional programming 如何创建“FnOnce”函数

Functional programming 如何创建“FnOnce”函数,functional-programming,rust,traits,Functional Programming,Rust,Traits,我正在尝试创建一个函数,该函数只有一次fn 以下代码片段不起作用: // 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: doe

我正在尝试创建一个函数,该函数只有一次
fn

以下代码片段不起作用:

// 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() -> ());
//尝试1
//错误在编译时没有已知的大小
让f:FnOnce()->()=|| println!(“你好”);
//尝试2
fn g()>(c:T)->(FnOnce()->()){
C
}
//错误:编译时没有已知的大小
设f=g(| | println!(“你好”);
//尝试3
//错误:强制转换为未调整大小的类型
设f=(| | println!(“Hello”)为(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());
}

fn delay
FnOnce()->()
不是一种类型,而是一种特性。让f=| | println有什么问题!(“你好”)?没关系,我只是想了解Fn*traits是如何工作的。@fcracker79这与匿名闭包类型有关,而不是与Fn traits有关。谢谢你的回答。事实上,我希望得到与
let f=move | | println相同的结果!(“{}”,a)
:既然我正在闭包环境中移动
a
,为什么
f
a
FnOnce
?@fcracker79
println
是一个非常神奇的宏。因此,当
a
以参数形式出现而没有
&
时,并不意味着它被移动。感谢您的解释。同意,但是
move
关键字应该可以。
println应该是不相关的。总而言之,有没有一种方法可以让Rust决定创建一个仅为
FnOnce
的闭包,而不需要像将
FnOnce
作为参数的函数这样的技巧?