Как передать значение в Vec и одновременно добавить его в строку? - PullRequest
0 голосов
/ 09 января 2019

Я хочу написать программу, которая устанавливает оболочку для системной программы командной строки nslookup:

fn main() {
    let mut v: Vec<String> = Vec::new();
    let mut newstr = String::from("nslookup");
    for arg in std::env::args() {
        v.push(arg);
        newstr.push_str(&format!(" {}", arg));
    }
    println!("{:?}", v);
    println!("{}", newstr);
}
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() снова?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Вы можете сделать так:

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

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

Сначала вы создаете вектор, а затем создаете свою строку.

0 голосов
/ 09 января 2019

Обратный порядок строк, которые используют 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! (как показано выше), что является более кратким и может быть более производительным.

Смотри также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...