如何将值同时推送到Vec并将其附加到字符串?

时间:2019-01-09 16:52:36

标签: rust

我想编写一个程序,为系统的nslookup命令行程序设置外壳程序:

error[E0382]: borrow of moved value: `arg`
 --> src/main.rs:6:41
  |
5 |         v.push(arg);
  |                --- value moved here
6 |         newstr.push_str(&format!(" {}", arg));
  |                                         ^^^ value borrowed here after move
  |
  = note: move occurs because `arg` has type `std::string::String`, which does not implement the `Copy` trait
env::args()

如何在不再次遍历ERROR in src/app/providers/dynamic-data/dynamic-data.service.ts(5,26): error TS1149: File name '/Users/gibranshah/repos/eva/EVA/src/app/model/endpoint.ts' differs from already included file name '/Users/gibranshah/repos/eva/EVA/src/app/model/Endpoint.ts' only in casing. 的情况下更正代码?

2 个答案:

答案 0 :(得分:2)

颠倒使用arg的行的顺序:

for arg in std::env::args() {
    //newstr.push_str(&format!(" {}", arg));
    write!(&mut newstr, " {}", arg);
    v.push(arg);
}

Vec::push通过值来接受参数,这将移动arg的所有权,因此在v.push(arg)之后将不再使用它。 format!和相关的宏隐式借用了它们的参数,因此您可以在其中之一中使用arg之后再次使用。

如果确实需要将相同的String移动到两个不同的位置,则需要添加.clone(),以复制字符串。但这在这种情况下不是必需的。

还请注意,format!创建了一个新的String,当您只想添加到现有String的末尾时,这样做很浪费。如果将use std::fmt::Write;添加到文件顶部,则可以改用write!(如上所示),这样更简洁,而且性能可能更高。

另请参见

答案 1 :(得分:1)

您可以这样做:

fn main() {
    let args: Vec<_> = std::env::args().collect();
    let s = args.join(" ");

    println!("{}", s);
}

首先,创建矢量,然后创建字符串。