我尝试重新创建功能组合
fn compose<A, B, C>(f : |B| -> C,
g : |A| -> B)
-> |A| -> C{
|x| f(g(x))
}
但我得到了一生的错误。我读到闭包是基于堆栈的,但它不能解释为什么我会收到此错误。
let f3 = compose(f1,f2);
我不能将闭包移出目前的范围吗?
答案 0 :(得分:4)
是的,Rust的当前闭包通过引用捕获,并将闭包的环境(即对捕获的变量的引用)放在堆栈上,通过引用引用它。因此,只要你有一个捕获外部变量的闭包(你正在捕获f
和g
),它就被链接到创建它的堆栈帧。
C ++ 11风格的unboxed closures通过允许按值捕获值并允许直接存储环境(即没有强制引用)来解决这个问题。确切的语法尚未最终确定,但您所写的内容可能有效。