Rust Option.as_ref() 方法

https://doc.rust-lang.org/std/option/

Rust Option、Result 等类型有 as_ref() 方法,对这个方法的理解牵扯到对结构体、Option 这种较复杂类型的所有权机制的理解,所以值得讨论一下。

Option<T> 枚举类型的所有权模型和自定义的 Struct 的所有权类型相似,都可以按照"容器"和"内容"这种框架来理解。比如

rust 复制代码
struct Wrapper {
    s: String,
}

let a: Wrapper = Wrapper { String::from("Hello") };

a 变量具有 Wrapper 这个"盒子"的所有权,他就自然具有 Wrapper.s 这个内容的所有权。对于 Option<T> 类型来讲也是一样,一个变量具有 Option<T> 的所有权,就自然具有 T 的所有权。

对于自定义的结构体,我们可以方便的自定义方法来获取"内容"的引用,让我们在不消费结构体变量的情况下查看结构体。

rust 复制代码
impl Wrapper {
    fn check(&self) -> &String {
        &self.s
    }
}

对于 Option<T> 类型,查看手册会发现,常用的查看 T 的手段都是会消耗对 Option<T> 对象的所有权的,比如 unwrap, ok_or 等方法的参数都是 self, 而非 &self。

一般的语法又不能直接访问 T, (不能像 impl Wrapper 中 &self.s 这么简单),所以 Rust 为开发者提供了 as_ref 方法,返回一个 Option<&T> 类型。as_ref 方法的关键在于,返回的新的 Option 对象 封装了 T 的引用, 我们之后可以消费这个新的 Option 对象来得到我们想要的引用了,注意这里消费的是新的 Option 而不是旧的

as_ref 方法实际上做了两件事:解包原 Option 获取 T 的引用(这一步采用了不常用的语法)、构造新的 Option 将 T 的引用放入(不直接返回 T 的引用是因为要处理 None 的可能性)

as_mut 方法的情况是类似的。

相关推荐
guodingdingh10 小时前
软件开发工作问题总结0718
java·开发语言·数据库
花褪残红青杏小11 小时前
Rust图像处理第20节-PCA 主成分分析:把图片压缩到 3 个数字
rust·webassembly·图形学
优橙教育12 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
SeaTunnel14 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影14 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Marst Code15 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao1213115 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
CRMEB系统商城16 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience18 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
我的xiaodoujiao18 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具