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