2015-05-19 2 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(); 
            ^

Что я могу сделать сейчас? Я пробовал много вещей, таких как Box или Arc, но я не мог заставить его работать. Мне как-то нужно создать копию s, которая также живет в потоках. Но как мне это сделать?

ответ

4

Проблема, в основном, заключается в том, что line является заемным участком в s. Здесь вы действительно ничего не можете сделать, так как нет никакого способа гарантировать, что каждый line не переживет s.

Также, чтобы быть ясным: существует абсолютно нет способа в ржавчине «продлить срок службы переменной». Это просто невозможно.

Самый простой способ обойти это, чтобы перейти от 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()) новообращенные из &str в String. Поскольку String владеет своим содержимым, его можно безопасно перемещать в закрытие каждого потока и жить независимо от потока, который его создал.

Примечание: вы мог сделать это в ночных Rust с помощью новой контекстной резьбы API, но это по-прежнему нестабильно.

Смежные вопросы