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