为何thread::scope无需move闭包就无法复制原始类型?
问题解答
这不是Rust编译器的bug,而是代码本身的问题。
为什么index(Copy类型)也会报错?
Rust闭包的变量捕获规则是优先以借用方式捕获,哪怕变量实现了Copy trait。在你的代码里,闭包默认尝试借用index和foo,但thread::scope要求闭包的生命周期要覆盖整个作用域周期(标记为'1的生命周期),而循环里的index和foo是每次迭代的局部变量,借用的生命周期无法满足要求,因此编译器报错。
哪怕index是Copy类型,编译器也不会自动为闭包复制变量——你需要明确告诉编译器要捕获变量的所有权(用move闭包),或者显式复制变量(比如index.clone())。
关于错误信息里的'1
这个是编译器用来标记**Scope结构体的生命周期**的占位符,是正常的生命周期标注方式,不需要替换。它表示闭包必须能存活到Scope的生命周期结束,也就是thread::scope代码块的整个执行周期。
修复方案
按照编译器提示,给闭包加上move关键字,让闭包获取index和foo的所有权:
use std::thread; #[derive(Debug)] struct ImportantStruct {} fn main() { let mut data = vec![42, 42, 42, 42]; let s = ImportantStruct{}; thread::scope(|scope| { for (index, foo) in data.drain(..).enumerate() { scope.spawn(move || println!("thread {} doing {} while having a borrow on {:?}", index, foo, &s)); } }); }
这样闭包会复制index(因为它是Copy类型)并获取foo的所有权,生命周期问题就解决了;同时&s的借用也因为thread::scope保证线程在s的生命周期内结束而合法。
内容的提问来源于stack exchange,提问作者Benni
相关产品推荐
相关产品推荐

