首页 > 解决方案 > 传递“OsStr”数组的惯用方式

问题描述

传递或表示 a 的惯用方式是&[&OsStr]什么?这种方式似乎有很多不必要的文字:

fn foo(file: &OsStr) {
    Command::new("bar")
        .args(&[OsStr::new("baz"), OsStr::new("qux"), file])
        .spawn();
}

这种方式看起来更干净,并且在某些文档中是这样做的。但是,file.to_str().unwrap()会分散注意力,将 an 转换OsStr为 astr只是将其转换回 a是很奇怪的OsStr

fn foo(file: &OsStr) {
    Command::new("bar")
        .args(&["baz", "qux", file.to_str().unwrap()])
        .spawn();
}

有第三种选择吗?

标签: arraysstringrustidioms

解决方案


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

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]

推荐阅读