为什么在功能结束时仍借用“数据”?

时间:2019-02-01 15:19:55

标签: concurrency rust

polyfill上实现了map-reduce示例之后,我试图用存储在另一个文件中的数据来做同样的事情。编译器现在告诉我,我的data变量是通过'static生存期借用的,并且生存期不够长。我不确定谁在借用我的“数据”,也不确定如何响应编译器的帮助。

我已经尝试添加所有类型注释,以查看是否在某处假定了错误的类型,但这无济于事。如果data&'static str而不是String,则相同的代码有效。

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);
}
error[E0597]: `data` does not live long enough
  --> src/main.rs:5:24
   |
5  |     let chunked_data = data.split_whitespace();
   |                        ^^^^-------------------
   |                        |
   |                        borrowed value does not live long enough
   |                        argument requires that `data` is borrowed for `'static`
...
22 | }
   | - `data` dropped here while still borrowed

我确定这个问题很容易解决,但是我似乎找不到谁在借我的data

1 个答案:

答案 0 :(得分:0)

split_whitespace方法在&str上运行,由于循环中move的闭合,这是一个问题。一种快速的解决方法是改为对自己拥有的String进行操作:

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