正如标题已经说过的,我试图将一个&[&str]
移动到一个线程中。嗯,其实,下面的代码工作,但我有两个问题是:将一个&[&str]移动到一个线程
let args2: Vec<_> = args.iter().map(|arg| { arg.to_string() }).collect();
似乎有点冗长的&[&str]
转换为Vec<String>
。这可以做到“更好”吗?- 如果我理解正确,字符串会被复制两次:第一个是
let cmd2
和let args2
语句;然后通过在move
关闭内移动它们。它是否正确?如果是这样,可以用一个副本来完成吗?
我所知道的thread::scoped
,不过目前已被弃用。我也在编写这个代码来学习一些关于Rust的知识,所以关于“不可信”代码的评论也是值得赞赏的。
use std::process::{Command,Output};
use std::thread;
use std::thread::JoinHandle;
pub struct Process {
joiner: JoinHandle<Output>,
}
impl Process {
pub fn new(cmd: &str, args: &[&str]) -> Process {
// Copy the strings for the thread
let cmd2 = cmd.to_string();
let args2: Vec<_> = args.iter().map(|arg| { arg.to_string() }).collect();
let child = thread::spawn(move || {
Command::new(cmd2).args(&args2[..]).output().unwrap_or_else(|e| {
panic!("Failed to execute process: {}", e)
})
});
Process { joiner: child }
}
}
谢谢你'String :: from'。对于第二点,我首先明确地将字符串复制到'cmd2'和'args2'中,但是当它们被移入闭包时,它们是不是也被物理地复制到了线程堆栈中呢? – Garogolun
@Garogolun那么,矢量被复制,但这只是一个浅拷贝(即包含指针,长度和容量的结构)。矢量的内容不被复制。 – fjh
线程可以访问向量的内容。但是,如果'Process :: new'返回,则矢量及其内容会被破坏。那么这不是不安全吗? – Garogolun