正如标题所说,我试图将&[&str]
移动到一个帖子中。嗯,实际上,下面的代码有效,但我有两个问题:
let args2: Vec<_> = args.iter().map(|arg| { arg.to_string() }).collect();
将&[&str]
转换为Vec<String>
似乎有点冗长。可以做到这一点&#34;更好&#34;?let cmd2
和let args2
语句;然后将它们移到move
闭包内。它是否正确?如果是这样,可以用一份副本完成吗?我知道thread::scoped
,但目前已被弃用。我还要对此进行编码,以便更多地了解Rust,所以关于&#34; unrusty&#34;的评论代码也很受欢迎。
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 }
}
}
答案 0 :(得分:3)
let args2: Vec<_> = args.iter().map(|arg| { arg.to_string() }).collect();
将&amp; [&amp; str]转换为Vec似乎有点冗长。可以做到这一点&#34;更好&#34;?
我不这么认为。这有一些微小的变化也可以起作用(例如args.iter().cloned().map(String::from).collect();
),但我无法想到一个更好的变体。一个小问题是,使用to_string
将&str
转换为String
并不像使用String::from
或to_owned
一样有效。
如果我理解正确,字符串会被复制两次:首先是让let cmd2和let args2语句;然后将它们移动到移动闭合内部。它是否正确?如果是这样,可以用一份副本完成吗?
不,只会在您调用to_string
的位置复制字符串。字符串不会实现Copy
,因此它们永远不会隐式复制。如果在将字符串移动到闭包后尝试访问它们,则会出现编译器错误。