在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
。
答案 0 :(得分:0)
split_whitespace
方法在&str
上运行,由于循环中move
的闭合,这是一个问题。一种快速的解决方法是改为对自己拥有的String
进行操作:
for chunk in chunked_data.map(|chunk| chunk.to_owned())