Почему я не могу передать строку из env :: Args в Path :: new? - PullRequest
0 голосов
/ 26 сентября 2018

Рассмотрим следующий пример:

use std::env;
use std::path::Path;

fn main() {
    let args: Vec<_> = env::args().collect();
    let out_path: String = args[2];
    let _path = Path::new(out_path);
}

Вот ошибка, которую я получаю при компиляции:

error[E0308]: mismatched types
 --> main.rs:8:27
  |
8 |     let _path = Path::new(out_path);
  |                           ^^^^^^^^
  |                           |
  |                           expected reference, found struct `std::string::String`
  |                           help: consider borrowing here: `&out_path`
  |
  = note: expected type `&_`
             found type `std::string::String`

Теперь, если я последую совету компилятора, я получу следующее:

error[E0507]: cannot move out of indexed content
 --> main.rs:7:28
  |
7 |     let out_path: String = args[2];
  |                            ^^^^^^^
  |                            |
  |                            cannot move out of indexed content
  |                            help: consider using a reference instead: `&args[2]`

error: aborting due to previous error

Что, после применения предложения, приводит меня к предыдущей ошибке:

error[E0308]: mismatched types
 --> main.rs:7:28
  |
7 |     let out_path: String = &args[2];
  |                            ^^^^^^^^
  |                            |
  |                            expected struct `std::string::String`, found reference
  |                            help: consider removing the borrow: `args[2]`
  |
  = note: expected type `std::string::String`
             found type `&std::string::String`

Как понять ситуацию и решить проблему?

1 Ответ

0 голосов
/ 26 сентября 2018

Это действительно была неудачная последовательность предложений (используйте ссылку> удалить эту ссылку), но это было вызвано надписью типа вручную, связанной с out_path.

Вам нужен фрагмент строки, а несобственные String:

let out_path: &str = &args[2];

Это соответствует как ограничению args (вы не можете выйти из проиндексированного содержимого), так и требованиям Path::new, для которого требуется ссылка.

Что касается вашего комментария, clone() "исправляет" ошибку cannot move out of indexed content, поскольку не требует перемещения от вектора args - вместо этого он копирует элемент из него.Это исправление, конечно, уступает только заимствованию, которое также работает с Path::new.

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