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

相关推荐
五阿哥永琪29 分钟前
1. 为什么java不能用is开头来做布尔值的参数名,会出现反序列化异常。
java·开发语言
逻极1 小时前
pytest 入门指南:Python 测试框架从零到一(2025 实战版)
开发语言·python·pytest
你的冰西瓜1 小时前
C++ STL算法——排序和相关操作
开发语言·c++·算法·stl
海边的Kurisu2 小时前
Mybatis-Plus | 只做增强不做改变——为简化开发而生
java·开发语言·mybatis
浅念-2 小时前
C++ 模板进阶
开发语言·数据结构·c++·经验分享·笔记·学习·模版
Omigeq3 小时前
1.2.2 - 采样搜索算法(以RRT和RRT*为例) - Python运动规划库教程(Python Motion Planning)
开发语言·人工智能·python·机器人
m0_531237173 小时前
C语言-操作符进阶
c语言·开发语言
q1234567890984 小时前
FNN sin predict
开发语言·python
Source.Liu4 小时前
【egui】官方示例 hello_world 完全解析
rust·egui
沐知全栈开发4 小时前
C++ 多态
开发语言