此代码无法编译...
fn main() {
let data = "hi".to_string();
let wrap = &data;
std::thread::spawn(move || println!("{}", wrap));
}
...因为data
不在生成的线程中:error[E0597]: `data` does not live long enough
--> src/main.rs:3:16
|
3 | let wrap = &data;
| ^^^^^ borrowed value does not live long enough
4 | std::thread::spawn(move || println!("{}", wrap));
| ------------------------------------------------ argument requires that `data` is borrowed for `'static`
5 | }
| - `data` dropped here while still borrowed
为什么Rust不像data
那样移动wrap
?有什么方法可以迫使data
与wrap
一起移动?我的真实代码看起来更像这样。我接受一条消息,对其进行解析,然后将其发送到线程进行处理。
struct Message {
data: Vec<u8>,
}
let message = Message {
data: "{\"name\":\"Rust\"}".to_string(),
};
#[derive(Deserialize)]
struct Parsed<'a> {
name: &'a str,
}
let parsed: Parsed = serde_json::from_slice(&message.data).unwrap();
std::thread::Builder::new()
.name(parsed.name) // note: need some of the parsed data prior to moving into the thread...so cannot solve with JSON parsing inside thread
.spawn(move || println("{}", parsed.name));
我知道我可以将Parsed
结构修改为使用String
而不是&'a str
,但是当编译器应该能够很好地移动data
时,这会降低效率。
最佳答案
Why doesn't Rust move
data
like it doeswrap
有几个原因-请选择:
wrap
而不是data
,所以闭包移动了捕获的内容。data
的移动将立即使wrap
本身以及对data
的其他引用(如果存在)无效。另外,封闭范围本身可能需要data
才能进行进一步访问。move
闭包,但仍然可以选择通过创建显式引用并捕获该引用来捕获某些值。您建议的功能将使此操作变得不可能。关于rust - 为什么 `move`不将引用的数据与引用一起移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64338318/