我有这个代码:
let fd = libc::creat(path, FILE_MODE);
if fd < 0 {
/* error */
}
Run Code Online (Sandbox Code Playgroud)
C中的等价物更短:
if ((fd = creat(path, FILE_MODE)) < 0) {
/* error */
}
Run Code Online (Sandbox Code Playgroud)
我可以在Rust做类似的事吗?我试图将它映射到if let但它看起来像处理Options.
不,这不可能通过设计.let绑定是Rust中两个非表达式语句之一.这意味着绑定不会返回任何可以进一步使用的值.
作为表达式的绑定在Rust中通常没有多大意义.考虑let s = String::new():这个表达式不能返回String,因为s拥有字符串.或者怎么样let (x, _) = get_tuple()?表达式会返回整个元组还是只返回未被忽略的元素?所以⇒ let绑定不是表达式.
关于if let:可悲的是,这也无济于事.它只是让我们能够测试一个解构是否有效还是换句话说:构建一个可反复的模式.这不仅适用Option<T>于所有类型,而且适用于所有类型.
如果你真的想缩短这个代码,有一种方法:可以c_int轻松转换成更惯用的类型,比如Result.这最好通过扩展特性完成:
trait LibcIntExt {
fn to_res(self) -> Result<u32, u32>;
}
impl LibcIntExt for c_int {
fn to_res(self) -> Result<u32, u32> {
if self < 0 {
Err(-self as u32)
} else {
Ok(self as u32)
}
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个你可以if let在结果中使用Result:
if let Err(fd) = libc::creat(path, FILE_MODE).to_res() {
/* error */
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |