关于 Result 和 Option

关于 Result 和 Option

·

1 min read

我最近在开发 Rust 的时候,感觉自己对这两个特性在理解上有些偏差,本文记录一下我原本的理解,和被纠正后的理解。

Result

这个我一直是当 Rust 中的 Promise 来看的,但实际上不是这样的,这和 Promise 八竿子打不着,Result 和异步任务没关系,他只表示一个可能会成功,也可能会失败的事情

调用返回值Result 的函数时,必须要加上 unwrap,要不然编译器会报错,我以前认为 unwrap 就是用来拿 Ok 值的,所以疑惑“我不需要拿返回值,我就调用函数,为什么也要加?”。

准确的理解是这样的,Rust 中没有 try…catch 这种错误捕获的语法,Result 补充的就是这种错误捕获场景,当一个函数返回 Result 时,那么就表示它在执行过程中可能会出错unwrapexcept 就是后续处理方法,如果只用 unwrap 那就表示不考虑出错的情况,换成其他语言大概是:

try {
  x // ReferenceError
} catch (err) {
    // 摆烂,报错就让他报
    throw err
}

如果要好好处理错误,就用 matchunwrap_or_else 等方式去定义后续操作。

Option

Option 补充的实际上是 null 的场景,因为 Rust 在类型上没有空的概念,所以会用 Option::None表示空值

换句话说,如果值是 Nullable 的,果断使用 Option

Option 也有 unwrap 函数,用起来也是取值,如果值是 Some,就会消耗自身,然后返回 Some 中的值,如果是 None,就会 panic。

这点和 Result 是一样,直接使用 unwrap 属于摆烂的做法,正确的做法应该是用 unwrap_or_else 等去分类处理。

? 和 unwrap

两个的相同点都是取值,但不同点在于遇到错误时的处理方法? 像是抛出错误的语法糖,遇到错误的时候不会 panic,他会将错误返回,并且不执行后续代码,所以这也要求函数的返回值是个 Result<T, io::Error>(像是 java 中不处理异常,直接在函数上标记 throws)。