传递 `OsStr` 数组的惯用方式
Idiomatic way to pass an array of `OsStr`
传递或表示 &[&OsStr]
的惯用方式是什么?这种方式似乎有很多不必要的文字:
fn foo(file: &OsStr) {
Command::new("bar")
.args(&[OsStr::new("baz"), OsStr::new("qux"), file])
.spawn();
}
这种方式看起来更干净,而且 how it is done in some of the documentation。然而,file.to_str().unwrap()
让人分心,将 OsStr
转换为 str
只是为了将其转换回 OsStr
是很奇怪的。
fn foo(file: &OsStr) {
Command::new("bar")
.args(&["baz", "qux", file.to_str().unwrap()])
.spawn();
}
还有第三种选择吗?
由于您对第一个版本的主要抱怨是它过于冗长,这里尝试使用宏来减少冗长:
macro_rules! args {
($($a:expr),*) => {
&[
$(<AsRef<OsStr>>::as_ref(&$a),)*
]
}
}
pub fn foo(file: &OsStr) -> Result<Child> {
Command::new("bar")
.args(args!["baz", "qux", file])
.spawn()
}
我不知道这是否会 "idiomatic",但这主要是在这种情况下的偏好问题。我个人不太介意冗长,但也许可以将 args 列表略微缩短为
&["baz".as_ref(), "qux".as_ref(), file]
传递或表示 &[&OsStr]
的惯用方式是什么?这种方式似乎有很多不必要的文字:
fn foo(file: &OsStr) {
Command::new("bar")
.args(&[OsStr::new("baz"), OsStr::new("qux"), file])
.spawn();
}
这种方式看起来更干净,而且 how it is done in some of the documentation。然而,file.to_str().unwrap()
让人分心,将 OsStr
转换为 str
只是为了将其转换回 OsStr
是很奇怪的。
fn foo(file: &OsStr) {
Command::new("bar")
.args(&["baz", "qux", file.to_str().unwrap()])
.spawn();
}
还有第三种选择吗?
由于您对第一个版本的主要抱怨是它过于冗长,这里尝试使用宏来减少冗长:
macro_rules! args {
($($a:expr),*) => {
&[
$(<AsRef<OsStr>>::as_ref(&$a),)*
]
}
}
pub fn foo(file: &OsStr) -> Result<Child> {
Command::new("bar")
.args(args!["baz", "qux", file])
.spawn()
}
我不知道这是否会 "idiomatic",但这主要是在这种情况下的偏好问题。我个人不太介意冗长,但也许可以将 args 列表略微缩短为
&["baz".as_ref(), "qux".as_ref(), file]