我可以将变量assignent与if结合使用吗?

han*_*ast 3 rust

我有这个代码:

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.

Luk*_*odt 5

,这不可能通过设计.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)