Идиоматический способ передать массив `OsStr` - PullRequest
0 голосов
/ 14 декабря 2018

Какой идиоматический способ передать или представить &[&OsStr]?Этот способ, кажется, содержит много ненужного текста:

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

Этот способ выглядит чище, и это , как это делается в некоторых документах .Тем не менее, file.to_str().unwrap() отвлекает, и странно конвертировать OsStr в str, чтобы преобразовать его обратно в OsStr.

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

Есть ли третий вариант?

1 Ответ

0 голосов
/ 14 декабря 2018

Поскольку ваша основная жалоба на первую версию заключается в том, что она слишком многословна, вот попытка уменьшить многословие с помощью макроса:

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

Я не знаю, будет ли это "идиоматическим"", но это в основном вопрос предпочтений в подобных случаях.Лично я не слишком возражаю против многословия, но, возможно, немного сократю список аргументов до

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