Multithreading 延长线程变量的生存期

Multithreading 延长线程变量的生存期,multithreading,rust,lifetime,Multithreading,Rust,Lifetime,我正在从一个文件中读取一个字符串,将它按行分割成一个向量,然后我想在单独的线程中对提取的行进行处理。像这样: 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.re

我正在从一个文件中读取一个字符串,将它按行分割成一个向量,然后我想在单独的线程中对提取的行进行处理。像这样:

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);
        }
    }
}

我现在能做什么?我试过很多方法,比如
Box
Arc
,但都没能成功。我需要创建一个
s
的副本,它也存在于线程中。但是我该怎么做呢?

从根本上说,问题在于
s
中的一个借来的片段。在这里,您真的无能为力,因为无法保证每一行
都不会比
s
本身更长寿

另外,需要明确的是:在Rust中绝对没有办法“延长变量的生命周期”。这根本无法做到

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

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);
        });
    }
}
使用std::thread;
fn main(){
让mut s:String=“One\nTwo\ntree\n”。插入();
设k:Vec=s.split(“\n”).map(|s|s.into()).collect();
对于k中的行{
线程::生成(移动| |{
println!(“nL:{:?}”,行);
});
}
}
.map(|s | s.into())
&str
转换为
字符串。由于
字符串
拥有其内容,因此可以将其安全地移动到每个线程的闭包中,并独立于创建它的线程而存在

注意:您可以使用新的作用域线程API在nightly Rust中执行此操作,但这仍然不稳定

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);
        });
    }
}