Rust语言中闭包的move关键字具体有什么作用?
Rust闭包中
move关键字的作用解析 Rust官方文档中关于move关键字的说明如下:
以值的方式捕获闭包的环境。
move会将所有以引用或可变引用捕获的变量转换为以值捕获。
我最初的理解是,下面的代码:
move || { thread_function(&flag, &some_data); }
会被转换为:
|| { thread_function(flag, some_data); }
换句话说,原本作为引用的变量被转换为“按值转移”的形式,但这显然不合理。
如果从闭包的本质出发,合理的思维模型是闭包是仿函数的语法糖——仿函数类似结构体,结构体的成员就是闭包捕获列表中的参数。比如:
let x; let y; let z; let lambda = || { println!("{}, {}, {}", x, y, z); }
对应的思维模型可以是:
struct Lambda { x: /* 对应捕获类型 */, y: /* 对应捕获类型 */, z: /* 对应捕获类型 */, } impl Fn for Lambda { /* 闭包逻辑实现 */ }
文档说明,局部变量的捕获优先采用引用方式,若需要可变性则采用可变引用方式。变量的捕获方式分为三种:
- 按值捕获(转移所有权):
lambda = || { /* 使用x: Type */ } - 按引用捕获:
lambda = || { /* 使用y: &Type */ } - 按可变引用捕获:
lambda = || { /* 使用z: &mut Type */ }
Rust会优先选择“按引用”捕获,当需要可变性且无法使用普通引用时,才会选择“按可变引用”捕获,但这就留下了一个疑问——“按值捕获”什么时候会触发?
基于仿函数模型,三种捕获方式对应的结构体成员类型分别是:
struct { x: Type, // 按值捕获 y: &Type, // 按引用捕获 z: &mut Type, // 按可变引用捕获 }
如果按照move让闭包按值捕获所有局部变量的描述,似乎引用捕获会转成值捕获,可变引用捕获会转成“可变值捕获”——但“按值捕获”和“可变值捕获”根本没有区别,因为值捕获已经拥有完整所有权,可变与否完全由闭包内部对成员的使用方式决定,这显然说不通。
那么问题来了:move关键字作用于闭包时究竟具体做了什么?
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

