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

相关推荐
MarkHD2 小时前
Python RPA入门实战:深入解析RPA核心概念与Python的优势(第5-6天)
开发语言·python·rpa
Konata122 小时前
实现进阶的C/S通信
java·开发语言
初听于你2 小时前
Java 泛型详解
java·开发语言·windows·java-ee
rainbow68892 小时前
Java17新特性深度解析
java·开发语言·python
bin91532 小时前
C盘瘦身大作战:程序员的存储空间优化全攻略
c语言·开发语言·c盘清理·c盘清理技巧分享
小秋学嵌入式-不读研版2 小时前
智能台灯功能重设计方案
开发语言
Z.风止2 小时前
Go-learning(1)
开发语言·笔记·后端·golang
子木鑫2 小时前
[SUCTF2019 & GXYCTF2019] 文件上传绕过实战:图片马 + .user.ini / .htaccess 构造 PHP 后门
android·开发语言·安全·php
挖矿大亨2 小时前
C++中const修饰成员函数
开发语言·c++