有一个很有意思的小技巧,你可以通过(空元组)返回“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}
文章插图
定义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提取出值 。文章插图
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会发出警告 。你可以使用_来代替 。
推荐阅读
- 从中医角度看福鼎白茶[养生茶]
- 太阳死亡后会变成 太阳从出生到死亡的过程
- 周杰伦经典歌词分享
- 男人爱冒汗是什么原因
- 月食每年发生几次 我国日食月食记录从哪朝开始
- 火星的5大秘密 从火星上看地球好恐怖
- 各类程序员学习路线图 Get了吗
- 数据库主从不一致,怎么解?
- 如何挑选羊奶?
- 放下从杯茶开始,杯中的茶越发的凉