将a& [& str]移动到一个线程中

时间:2015-09-26 20:49:40

标签: rust

正如标题所说,我试图将&[&str]移动到一个帖子中。嗯,实际上,下面的代码有效,但我有两个问题:

  1. let args2: Vec<_> = args.iter().map(|arg| { arg.to_string() }).collect();&[&str]转换为Vec<String>似乎有点冗长。可以做到这一点&#34;更好&#34;?
  2. 如果我理解正确,字符串会被复制两次:首先是let cmd2let args2语句;然后将它们移到move闭包内。它是否正确?如果是这样,可以用一份副本完成吗?
  3. 我知道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 }
        }
    }
    

1 个答案:

答案 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::fromto_owned一样有效。

  

如果我理解正确,字符串会被复制两次:首先是让let cmd2和let args2语句;然后将它们移动到移动闭合内部。它是否正确?如果是这样,可以用一份副本完成吗?

不,只会在您调用to_string的位置复制字符串。字符串不会实现Copy,因此它们永远不会隐式复制。如果在将字符串移动到闭包后尝试访问它们,则会出现编译器错误。