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

相关推荐
土豆12502 小时前
Rust宏编程完全指南:用元编程解锁Rust的终极力量
rust·编程语言
myloveasuka5 小时前
Java与C++多态访问成员变量/方法 对比
java·开发语言·c++
2301_821700535 小时前
C++编译期多态实现
开发语言·c++·算法
奥地利落榜美术生灬5 小时前
c++ 锁相关(mutex 等)
开发语言·c++
xixihaha13245 小时前
C++与FPGA协同设计
开发语言·c++·算法
重庆小透明5 小时前
【java基础篇】详解BigDecimal
java·开发语言
ID_180079054736 小时前
模拟1688商品详情的Python API实现,返回符合风格的JSON数据
开发语言·python·json
小小怪7506 小时前
C++中的函数式编程
开发语言·c++·算法
金山几座6 小时前
C#学习记录-事件
开发语言·学习·c#
小杍随笔6 小时前
【Rust 语言编程知识与应用:基础数据类型详解】
开发语言·后端·rust