std1.97.1——Option模块总览 目录0. 引言1. Option枚举简介2. Option与指针(可空指针)3. 问号运算符?(必用不用代码太繁琐了)4. 内存表示(暂时不知道这部分讲得什么玩意)参考0. 引言OptIon枚举上的方法单独在Option模块细览中。std::option模块总览没有对常用方法进行非常详细的展开。1. Option枚举简介Option类型表示一个可选值每个Option要么是Some并包含一个值要么是None不包含值。Option在Rust代码中很常用有如下用途初始值。对于并非在整个输入范围内都有定义的函数用作返回值。用于报告简单错误的返回值其中出错时返回None。可选的结构体字段。可以被借出或取走的结构体字段。可选的函数参数。可空指针。将事物从复杂情境中交换出来。Option通常与模式匹配配合使用以查询值的存在并采取行动始终处理None的情况。2. Option与指针(可空指针)Rust的指针类型必须始终指向有效的位置不存在空引用。相反Rust有可选指针比如OptionBoxT。fncheck_optional(optional:OptionBoxi32){matchoptional{Some(p)println!(has value {p}),Noneprintln!(has no value),}}fnmain(){letoptionalNone;check_optional(optional);letoptionalSome(Box::new(9000));check_optional(optional);}3. 问号运算符?(必用不用代码太繁琐了)与Result类型类似当编写调用许多返回Option类型的函数的代码时处理Some/None可能很繁琐。问号运算符?隐藏了一些将值向上传播到调用栈的代码。它能将下面这段代码fnadd_last_numbers(stack:mutVeci32)-Optioni32{letastack.pop();letbstack.pop();match(a,b){(Some(x),Some(y))Some(xy),_None,}}替换为fnadd_last_numbers(stack:mutVeci32)-Optioni32{Some(stack.pop()?stack.pop()?)}在表达式末尾加上?将得到Some解包后的值除非结果是None此时None会从外层函数提前返回。?可以用在返回Option的函数中因为它提供了None的提前返回。4. 内存表示(暂时不知道这部分讲得什么玩意)Rust保证对以下类型T进行优化使得OptionT与T具有相同的大小、对齐和函数调用ABI。因此当T是这些类型之一时将类型T的值t转换为类型OptionT(产生值Some(T))以及将类型OptionT的值Some(t)转换为类型T(产生值t)没有任何运行开销。在以下某些情况中Rust进一步保证transmute::_, OptionT([pu8; sizeof::T()])无开销并产生Option::T::Nonetransmute::_, [u8; sizeof::T()](Option::T::None)无开销并产生[0u8; size_of::T()]这些情况由第二列标识(Sized指的是类型的大小在编译时已知)T在[0u8; size_of::T()]和Option::T::None之间转换是否无开销BoxU, Global(默认Box)U: SizedUU: Sizedmut UU: Sized所有函数指针fn变体始终num::NonZero*始终ptr::NonNullUU: Sized#[repr(transparent)]标记的、且内部只包含一个此列表中类型的结构体当内部类型满足条件时在某些条件下上述类型T在包裹在Result中时也会进行优化上面这种优化称为空指针优化NPO。对于上面的情况可以进一步保证从T的所有有效值transmute到OptionT以及从Some::T(_)transmute到T(但将None::T转换到T是未定义行为参考1、Rust std::option