Skip to main content

Command Palette

Search for a command to run...

关于 Result 和 Option

Published
•1 min read•View as Markdown
关于 Result 和 Option

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

Result

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

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

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

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

如果要好好处理错误,就用 match、unwrap_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)。

More from this blog

12 月装机行动记录

(Banner 图文无关) 这几天买了新的装备回来升级配置,除了显卡和散热器,其他都更新了,这两个不更新的原因是太贵了。 由于我不太懂选配置,所以还是让朋友给推荐,我说我的预算在 5000 左右,他就给我转了一个整机,配置大概是这样的: CPU:AMD 9700X 主板:微星 B650M GAMING PLUS WIFI 或者 微星 B650M GAMING WIFI 显卡:木有 内存:英睿达/宇瞻 DDR5 6000 32G 硬盘:1T NVMe PCIe4 SSD 读速 3500M...

Dec 7, 20241 min read
12 月装机行动记录

Homekit + cozylife 插座连接 HA

近期在淘宝上买了个 Homekit + cozylife 的插座,就这种: 一开始只通过 iOS 访问,就是只连接 Homekit,长按开关重置插座,iOS 一扫码就连上了,后来我嫌在外面访问不了,又不想掏钱买苹果的 HomePod,于是就装上了 Home Assistant,打算让设备们都连上 HA,这样就不用交苹果税了。 连接方式还是通过 Homekit,一般来说支持 Homekit 设备都能这样连接,先连上 iOS,然后在 Home App 中移除设备,这时候就能在 HA 中找到设备了:...

Nov 30, 20241 min read
Homekit + cozylife 插座连接 HA

找到了一台祖传的 Ccd 相机

开个玩笑,这台相机其实是我们家在 05 年的时候买的,发票都还在呢,当时花了 4000 块钱!搁现在我都受不了,更别说当年了,看到价格我都震惊了。 相机的型号是索尼的 Cybershot DSC-N1,属于小红书时尚单品 CCD 相机,由于一直放在包装盒里,现在还有 99 新呢。 机子还是正常的,能开机,能拍照,其中一个问题是日期,这款没有 WiFi 功能,所以时间只能保存在本地,不知道是不是 BUG,每次开机都让我重新设置,默认就定在 2005 年 1 月 1 日。 第二个问题是电池,电池应该...

Nov 28, 20241 min read
找到了一台祖传的 Ccd 相机

记录和 ffmpeg 与 LLM 搏斗的两天

要做的 最近在写一个制作视频的功能,就是把 N 个视频合并,然后把对应的 N 张图片,在视频开始的前 5 秒叠加显示出来。 第一口 - diffusion studio 本来我用的是 diffusion studio,这是一个 JS 库,但这玩意性能太差了,因为他要把视频每一帧都读到 canvas 里,数据一多页面就卡住了(为啥要折腾 DOM 呢?) 而且他的 API 十分不好用,作为浏览器脚本你无法读本地数据也就算了,你起码给一个接受纯数据的参数吧,比如 HTML 类型接受源代码,Image ...

Nov 16, 20242 min read
记录和 ffmpeg 与 LLM 搏斗的两天
V

void mian

39 posts