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 方法的情况是类似的。

相关推荐
泡海椒28 分钟前
PDF 表格样式优化:jquick-pdf 边框、圆角、背景色
java·开发语言·pdf
Beyond_System|系统之外1 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55232 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
Bruce_Liuxiaowei4 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
梦醒沉醉5 小时前
std1.97.1——cmp模块细览
rust
aramae6 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
PC2005-cloud8 小时前
Rust学习笔记:错误处理——panic!、Result、Option与_运算符
rust
码行山野赴时序归途9 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
景熙55239 小时前
单体项目编写思路和落地形式
java·开发语言
计算机毕设定制辅导-无忧学长9 小时前
《基于SpringBoot的未成年人健康知识科普平台的设计与实现》
java·开发语言·vue.js·spring boot·未成年人健康知识科普平台