传递 `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]