2015-05-19 70 views
2

我正在从文件中读取一个字符串,将它按行分成一个向量,然后我想在分开的线程中对提取的行进行一些操作。就像这样:延长线程变量的生存期

use std::fs::File; 
use std::io::prelude::*; 
use std::thread; 
fn main() { 
    match File::open("data") { 
     Ok(mut result) => { 
      let mut s = String::new(); 
      result.read_to_string(&mut s); 
      let k : Vec<_> = s.split("\n").collect(); 
      for line in k { 
       thread::spawn(move || { 
        println!("nL: {:?}", line); 
       }); 
      } 

     } 
     Err(err) => { 
      println!("Error {:?}",err); 
     } 
    } 
} 

当然,这将引发一个错误,因为s会超出范围的线程开始之前:

s` does not live long enough 
main.rs:9   let k : Vec<_> = s.split("\n").collect(); 
            ^

现在我该怎么办?我已经尝试了很多东西,例如BoxArc,但我无法正常工作。我不知何故需要创建s的副本,它也存在于线程中。但我该怎么做?

回答

4

问题从根本上说就是lines的借片。这里没有什么可以做的,因为没有办法保证每个line本身都不会超过s

此外,只需要清楚:在Rust中有绝对没有办法“延长变量的生命周期”。它根本无法完成。

解决这个问题的最简单的方法是从line去是拥有。像这样:

use std::thread; 
fn main() { 
    let mut s: String = "One\nTwo\nThree\n".into(); 
    let k : Vec<String> = s.split("\n").map(|s| s.into()).collect(); 
    for line in k { 
     thread::spawn(move || { 
      println!("nL: {:?}", line); 
     }); 
    } 
} 

.map(|s| s.into())将从&strString。由于String拥有其内容,因此它可以安全地移入每个线程的闭包中,并独立于创建它的线程而生活。

注意:你为此在使用新的作用域线程API夜间锈,但仍然不稳定。