2015-05-19 71 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夜間鏽,但仍然不穩定。