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
    ,并且闭包移动捕获的内容

  • 因为移动
    数据
    会立即使
    包装
    本身和对
    数据
    的其他引用(如果存在)失效。此外,封闭范围本身可能需要
    数据
    ,以便进一步访问

  • 因为这样就不可能有一个通过移动和引用捕获某些值的闭包。当前,您可以进行闭包
    移动
    ,但仍然选择通过引用捕获某些值,只需创建一个显式引用并捕获该引用即可。你建议的功能将使这不可能

  • 为什么Rust不像它那样移动
    数据
    包装

    有几个原因-请选择:

  • 因为捕获的是
    wrap
    ,而不是
    data
    ,并且闭包移动捕获的内容

  • 因为移动
    数据
    会立即使
    包装
    本身和对
    数据
    的其他引用(如果存在)失效。此外,封闭范围本身可能需要
    数据
    ,以便进一步访问

  • 因为这样就不可能有一个通过移动和引用捕获某些值的闭包。当前,您可以进行闭包
    移动
    ,但仍然选择通过引用捕获某些值,只需创建一个显式引用并捕获该引用即可。你建议的功能将使这不可能


  • 看起来你的问题可能会由你的答案来回答。如果没有,请回答您的问题以解释差异。否则,我们可以将此问题标记为已回答。这是否回答了您的问题?重新表述我的问题:一旦我移动了一个引用,即使我以某种方式将其与引用一起移动,我也永远无法使用原始内容?这听起来不像是对同一个问题的重新表述。移动
    换行
    不会影响对
    数据的处理。(移动或改变
    数据
    将使
    包装
    无效。)此处出现错误消息的原因是
    thread::spawn
    要求所有引用都是
    静态的
    。您的问题似乎可以通过以下答案得到回答。如果没有,请回答您的问题以解释差异。否则,我们可以将此问题标记为已回答。这是否回答了您的问题?重新表述我的问题:一旦我移动了一个引用,即使我以某种方式将其与引用一起移动,我也永远无法使用原始内容?这听起来不像是对同一个问题的重新表述。移动
    换行
    不会影响对
    数据的处理。(移动或改变
    数据
    将使
    包装
    无效。)此处出现错误消息的原因是
    thread::spawn
    要求所有引用都是
    静态的。