从高级程序员的角度来看,Rust 基础知识( 三 )

有一个很有意思的小技巧,你可以通过(空元组)返回“void” 。既没有 return 语句,也不会返回值的函数会返回 。
常见结构
Option<T>
● 这是一个枚举,值为Some(T) 或 None 。(我们稍后再讨论enum,Rust中的枚举与其他语言略有不同 。)
● 如果想获取该值,你可以使用 match,就像使用其他枚举一样,或者使用 .unwrap (如果值为None,则会导致panic) 。
Result<T, E>
● 这个结构与 Option 类似,但常用于处理错误(通常由 IO 方法返回) 。
● 它的值是 Ok(T) 或 Err(E) 。
● 如果想获取该值,你可以使用match 块或 unwrap 。
● 为了方便使用,当函数返回 Result<T, E> 时,可以在返回值为 Result<T, E>(其中E必须为兼容的类型)的方法调用之后使用 ? 来返回错误E(类似于使用.unwrap(),但当函数出错时不会造成panic) 。
fn example -> Result<, Error> { // 一种错误类型 。为了简便起见,你可以使用String,或自定义enum 。 something_that_returns_result?; Ok() // returns empty Tuple}Vec<T>
● 向量是可增长的数组,存储在堆上 。
● 向量支持 .push、.pop 等常用操作 。详情参见Rust文档 。
Box<T>
● 在堆上存储T 。可用于在结构中使用enum,或者用于释放栈空间 。
定义结构
结构类似于对象,但它们的大小是静态的 。
结构可以通过如下几种方式定义 。
● 使用Tuple作为声明(类似于元组的别名)
struct Something(u8, u16); // a struct with 2 numbers, one unsigned 8 bit, the other one unsigned 16 bit● 使用对象表示法(类似于声明类或对象)
struct Something { value: u8, another_value: u16}● 使用struct作为别名
struct Something = u8; // a single value这种方法的适用情况为:你试图创建一个enum,而其值可能是正在定义的结构,而该结构中又要(直接或间接)引用该enum 。
struct MaybeRecursive { possibly_self: Option<MaybeRecursive> // error!}struct MaybeRecursive { possibly_self: Option<Box<MaybeRecursive>> // fine} 我在为自己的shell创建抽象语法树时,就遇到了这个问题 。
要创建结构的实例,需要使用下述写法(类似于C#中定义数组):
Something { variable: 1, another_variable: 1234}

从高级程序员的角度来看,Rust 基础知识

文章插图
定义enum
下面是示例:
enum EnumName { First, Second}可以为enum指定数值(例如序列化或反序列化数值的情况):
enum EnumName { First = 1, Second // auto incremented}更强大的写法如下:
enum EnumName { WithValue(u8), WithMultipleValues(u8, u64, SomeStruct), CanBeSelf(EnumName), Empty}你可以用match提取出值 。
从高级程序员的角度来看,Rust 基础知识

文章插图
Match
match是Rust最强大的功能之一 。
Match是更强大的switch语句 。使用方法与普通的swtich语句一样,除了一点:它必须覆盖所有可能的情况 。
let var = 1;match var { 1 => println!("it's 1"), 2 => println!("it's 2"), // following required if the list is not exhaustive _ => println!("it's not 1 or 2")}也可以match范围:
match var { 1..=2 => println("it's between 1 and 2 (both inclusive)"), _ => println!("it's something else")}也可以什么都不做:
match var { _ => {}}可以使用match安全地unwrap Result<T, E>和Option<T>,以及从其他enum中获取值:
let option: Option<u8> = Some(1);match option { Some(i) => println!("It contains {i}"), None => println!("it's empty :c") // notice we don't need _ here, as Some and None are the only possible values of option, thus making this list exhaustive}【从高级程序员的角度来看,Rust 基础知识】如果你不使用i(或其他值),Rust会发出警告 。你可以使用_来代替 。


推荐阅读