经过长时间休息后我又回到了Rust。我试图做以下事情:
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有关吗?)
答案 0 :(得分:2)
如果您阅读了Command::arg
的签名,则可以看到它接受的类型。它是可以作为OsStr
引用的任何类型:
pub fn arg<S: AsRef<OsStr>>(&mut self, arg: S) -> &mut Command
如果查看implementors of AsRef
,您会看到Path
是一个:
impl AsRef<OsStr> for PathBuf {}
impl AsRef<OsStr> for Path {}
回到你的问题:
如何将Path传递给Command :: 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");