Если вы прочитаете подпись для 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");