Rust 为什么';t`move`将引用的数据与引用一起移动?
此代码不编译Rust 为什么';t`move`将引用的数据与引用一起移动?,rust,Rust,此代码不编译 fn main(){ 让data=“hi”指向字符串(); 让wrap=&data; std::thread::spawn(move | | println!(“{}”,wrap)); } …因为数据不存在于生成的线程中: 错误[E0597]:`data`的寿命不够长 -->src/main.rs:3:16 | 3 |让包装=&数据; |^^^^^^借来的价值寿命不够长 4 | std::thread::spawn(move | | println!(“{}”,wrap)); |
fn main(){
让data=“hi”指向字符串();
让wrap=&data;
std::thread::spawn(move | | println!(“{}”,wrap));
}
…因为数据
不存在于生成的线程中:
错误[E0597]:`data`的寿命不够长
-->src/main.rs:3:16
|
3 |让包装=&数据;
|^^^^^^借来的价值寿命不够长
4 | std::thread::spawn(move | | println!(“{}”,wrap));
|-----------------------------------参数要求为“静态”借用“数据”`
5 | }
|-“数据”在仍被借用的情况下放在这里
为什么Rust不像它那样移动数据
?有没有办法强制数据
随包装一起移动
我的真实代码看起来更像这样。我接受一条消息,对其进行解析,然后将其发送到线程进行处理
struct消息{
资料来源:Vec,
}
让消息=消息{
数据:“{\“name\”:\“Rust\”}”,
};
#[导出(反序列化)]
结构解析
为什么Rust不像它那样移动数据
包装
有几个原因-请选择:
wrap
,而不是data
,并且闭包移动捕获的内容
数据
会立即使包装
本身和对数据
的其他引用(如果存在)失效。此外,封闭范围本身可能需要数据
,以便进一步访问
移动
,但仍然选择通过引用捕获某些值,只需创建一个显式引用并捕获该引用即可。你建议的功能将使这不可能
数据
包装
有几个原因-请选择:
wrap
,而不是data
,并且闭包移动捕获的内容
数据
会立即使包装
本身和对数据
的其他引用(如果存在)失效。此外,封闭范围本身可能需要数据
,以便进一步访问
移动
,但仍然选择通过引用捕获某些值,只需创建一个显式引用并捕获该引用即可。你建议的功能将使这不可能
看起来你的问题可能会由你的答案来回答。如果没有,请回答您的问题以解释差异。否则,我们可以将此问题标记为已回答。这是否回答了您的问题?重新表述我的问题:一旦我移动了一个引用,即使我以某种方式将其与引用一起移动,我也永远无法使用原始内容?这听起来不像是对同一个问题的重新表述。移动
换行
不会影响对数据的处理。(移动或改变数据
将使包装
无效。)此处出现错误消息的原因是thread::spawn
要求所有引用都是静态的
。您的问题似乎可以通过以下答案得到回答。如果没有,请回答您的问题以解释差异。否则,我们可以将此问题标记为已回答。这是否回答了您的问题?重新表述我的问题:一旦我移动了一个引用,即使我以某种方式将其与引用一起移动,我也永远无法使用原始内容?这听起来不像是对同一个问题的重新表述。移动换行
不会影响对数据的处理。(移动或改变数据
将使包装
无效。)此处出现错误消息的原因是thread::spawn
要求所有引用都是静态的。