Skip to main content

Command Palette

Search for a command to run...

关于 Result 和 Option

Published
1 min read
关于 Result 和 Option

我最近在开发 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)。

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