Как передать путь к Command :: arg? - PullRequest
0 голосов
/ 30 мая 2018

Я возвращаюсь в Руст после долгого перерыва.Я пытаюсь сделать следующее:

use std::fs;
use std::path::Path;
use std::process::Command;

fn main() {
    let paths = fs::read_dir("SOME_DIRECTORY").unwrap();
    for path in paths {
        let full_path = path.unwrap().path();
        process(full_path);
    }
}

fn process<P: AsRef<Path>>(path: P) {
    let output = Command::new("gunzip")
        .arg("--stdout")
        .arg(path.as_os_str())
        .output()
        .expect("failed to execute process");
}
error[E0599]: no method named `as_os_str` found for type `P` in the current scope
  --> src/main.rs:50:23
   |
50 |             .arg(path.as_os_str())
   |                       ^^^^^^^^^

Command::Arg ожидает OsStr, но по какой-то причине я не могу преобразовать Path в OsStr (что-то связанное сAsRef?)

1 Ответ

0 голосов
/ 30 мая 2018

Если вы прочитаете подпись для Command::arg, вы сможете увидеть, какие типы она принимает.Это любой тип, на который можно ссылаться как OsStr:

pub fn arg<S: AsRef<OsStr>>(&mut self, arg: S) -> &mut Command

Если вы посмотрите на разработчиков AsRef, вы увидите, что Path - это один:

impl AsRef<OsStr> for PathBuf {}
impl AsRef<OsStr> for Path {}

Возвращаясь к вашему вопросу:

Как передать Путь к Команде :: arg?

По прохождениеот Path до arg:

fn process(path: &Path) {
    let output = Command::new("gunzip")
        .arg("--stdout")
        .arg(path)
        .output()
        .expect("failed to execute process");
}

Ваша проблема в том, что вы приняли универсальный P, который гарантированно реализует только одну реализованную черту: P: AsRef<Path>. Это не Path.Вот почему в сообщении об ошибке говорится, что нет метода as_os_str

error[E0599]: no method named `as_os_str` found for type `P` in the current scope

Единственное, что вы можете сделать для этого типа, это вызвать as_ref.Это вернет &Path:

let output = Command::new("gunzip")
    .arg("--stdout")
    .arg(path.as_ref())
    .output()
    .expect("failed to execute process");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...