Rust闭包中move关键字对引用变量的作用及使用疑问
Rust闭包中
move关键字的作用解析 我编写了一个将多个函数组合成单个函数的Rust函数:
fn compose<'a, T>(fns: &'a [&dyn Fn(T) -> T]) -> Box<dyn Fn(T) -> T + 'a> { Box::new(move |mut x| { for f in fns { x = f(x); } x }) }
若不在闭包前添加move关键字,会触发如下错误:
error[E0373]: closure may outlive the current function, but it borrows `fns`, which is owned by the current function --> src/lib.rs:2:14 | 2 | Box::new(|mut x| { | ^^^^^^^ may outlive borrowed value `fns` 3 | for f in fns { | --- `fns` is borrowed here
我不理解为何仅作为引用的fns需要被move到闭包中,想知道move在这里到底起什么作用?
核心解释
闭包的生命周期约束
你的compose函数返回的闭包被标注了生命周期'a,意味着它的存活时间必须和输入参数fns(一个引用)的生命周期一致。如果不加move,闭包会借用函数栈上的fns变量——但compose执行结束后,栈上的fns变量会被销毁,闭包如果还持有这个借用,就会产生悬垂引用,这是Rust绝对不允许的。move的本质是转移所有权
加move后,闭包会获取fns变量的所有权(这里fns是引用类型,所以转移的是这个引用的所有权,而非底层数组的所有权)。这样闭包就把这个引用存在自己的内部状态里,不再依赖compose的函数栈,确保后续调用闭包时,持有的引用依然符合'a的生命周期约束。引用所有权转移不影响原数据
不用担心move会夺走原数组的控制权——fns只是指向数组的引用,转移它的所有权不会改变原数组的生命周期,只是让闭包合法持有这个引用,完全符合函数签名的设计意图。
内容的提问来源于stack exchange,提问作者rencedm112
相关产品推荐
相关产品推荐

