Concurrency 为什么是';数据';在我的活动结束时还借吗?

Concurrency 为什么是';数据';在我的活动结束时还借吗?,concurrency,rust,Concurrency,Rust,在上实现map reduce示例后,我尝试做同样的事情,但数据存储在另一个文件中。编译器现在告诉我,我的数据变量是以的静态生命周期借用的,寿命不够长。我不确定是谁借用了我的“数据”,也不确定如何响应编译器的帮助 我已经尝试添加所有类型注释,以查看是否在某个地方假设了错误的类型,但这没有帮助。如果数据是&'static str而不是字符串,则相同的代码可以工作 use std::{fs, thread}; fn main() { let data = fs::read_to_string

在上实现map reduce示例后,我尝试做同样的事情,但数据存储在另一个文件中。编译器现在告诉我,我的
数据
变量是以
的静态
生命周期借用的,寿命不够长。我不确定是谁借用了我的“数据”,也不确定如何响应编译器的帮助

我已经尝试添加所有类型注释,以查看是否在某个地方假设了错误的类型,但这没有帮助。如果
数据
&'static str
而不是
字符串
,则相同的代码可以工作

use std::{fs, thread};

fn main() {
    let data = fs::read_to_string("data.txt").unwrap();
    let chunked_data = data.split_whitespace();

    let mut children = vec![];
    for chunk in chunked_data {
        children.push(thread::spawn(move || -> u32 {
            chunk.chars().map(|c| c.to_digit(10).unwrap()).sum()
        }));
    }

    let mut sums = vec![];
    for child in children {
        let sum = child.join().unwrap();
        sums.push(sum);
    }

    let res = sums.iter().sum::<u32>();
    println!("{}", res);
}

我确信这个问题很容易解决,但我似乎无法找出谁在借用我的
数据

split_whitespace
方法在
&str
上运行,这是由于循环中的
移动
闭包造成的问题。一个快速修复方法是对所拥有的
字符串
s进行操作:

for chunk in chunked_data.map(|chunk| chunk.to_owned())

正确的修复可以在副本中找到。^^“正确”总是取决于情况。讨论各种可能的解决方案。谁在借用我的
数据
-错误消息指向罪魁祸首:
split\u whitespace
。从,emphasis mine:返回的迭代器将返回字符串片段,这些片段是原始字符串片段的子片段,由任意数量的空格分隔