传递OsStr数组的惯用方式

时间:2018-12-14 15:12:46

标签: arrays string rust idiomatic

通过或表示&[&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

还有第三种选择吗?

1 个答案:

答案 0 :(得分:3)

由于您对第一个版本的主要抱怨是太冗长,因此尝试使用宏来减少冗长:

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()
}

我不知道这是否“惯用”,但是在这种情况下,这主要是优先考虑的问题。我个人不太介意冗长,但也许可以将args列表稍微缩短为

&["baz".as_ref(), "qux".as_ref(), file]