arrays - 传递“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();
}
有第三种选择吗?
解决方案
由于您对第一个版本的主要抱怨是它过于冗长,因此这里尝试使用宏来减少冗长:
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]
推荐阅读
- swift - 有没有办法在 MacOS 中创建圆形 NSLabel?
- java - VerticalGroup 内的标签不保持在左侧
- dart - 无法在颤动的两个页面之间传递空变量
- angular - NativeScript 预览问题
- swift - 迭代嵌套结构并返回每个结构的总值
- c# - 带有表单字段的 Bot 框架卡
- javascript - 有没有办法使用实例另一个接口提取接口实例?
- typescript - 多次调用 Observable.Subscribe 会创建多个订阅吗?
- ruby-on-rails - Rails 4.2.6 迁移到 5.0.0 (belongs_to_required_by_default)
- base64 - 为什么这个base64字符串在线解码而不是本地解码