9.1 Vector
9.1.1 创建 vector
- vector 只能储存相同类型的值!
- 创建空的 vector:
Vec::new()
- 创建有值的 vector:
vec!
宏
9.1.2 向 vector 中添加元素
9.1.3 读取 vector 的元素
- 索引语法:当引用一个不存在的元素时 Rust 会造成 panic
get
方法:当get
方法被传递了一个数组外的索引时,它不会 panic 而是返回None
,可后续用于match
进行对应的分支处理- 注意:不要同时读取并修改 vector!
9.1.4 遍历 vector 的元素
- 对 vector
&
引用:表示取其中每一个值的&
引用 - 若需对 vector 的值进行计算,则需使用
&mut &
可变引用,同时使用*
来解引用出对应的值 - 注意:在遍历时,若不添加
&
引用符号,表示直接取值,则会获取 vector 的所有权! for i in v
:取值,并移动 vector 的所有权for i in &v
:取不可变引用,搭配*
解引用for i in &mut v
:取可变引用,搭配*
解引用
9.1.5 在 vector 中使用枚举来储存多种类型
9.1.6 丢弃 vector 时也会丢弃其所有元素
9.2 String(所有权)、str(引用)
9.2.1 为什么字符串较为复杂?
9.2.2 什么是字符串
9.2.3 创建 String
String::new()
:创建一个空的 String"xxx".to_string()
:根据字符数据xxx创建一个 String(或者理解为向一个 String 中添加字符数据)String::from("xxx")
:根据字符数据xxx创建一个 String
9.2.4 更新字符串(一):向 String 中追加字符(串)
push
:获取一个单独的字符作为参数,并附加到 String 中push_str
:附加字符串 slice 到 String 中;此方法不获取参数的所有权
9.2.5 更新字符串(二):拼接 String
+
运算符:第一个参数必须使用原变量(该变量会被移动,夺去其所有权),后面的参数必须使用引用形式(若为&String
则会被强制转换为&str
)format!
宏:使用参数的引用,因此不会获取任何参数的所有权
9.2.6 Rust 的字符串不支持索引
9.2.7 字符串 slice
9.2.8 遍历字符串的方法
chars()
:拆分为单个字符,返回char
类型的值bytes()
:返回每一个原始字节
9.2.9 字符串并不简单
9.3 Hash Map
9.3.1 创建 Hash Map
- 与 vector 类似,hash map 是同质的:所有的键必须是相同类型,值也必须都是相同类型
HashMap::new()
:创建一个空的 hash map,使用insert(k, v)
方法往里面添加元素
9.3.2 访问 Hash Map
9.3.3 更新 Hash Map
- 直接覆盖一个值:最后一次更新的值为最终值
- 只在键没有对应值时插入键值对:
entry
的or_insert
方法,若存在值返回这个值的可变引用;若不存在则插入指定的值 - 根据旧值更新一个值:先获取旧值的可变引用,再更新(解引用
*
)
9.3.4 Hash Map 与所有权
- 对于有所有权的值,插入 hash map 后将会被移动;而对于像 i32 这样的实现了 Copy trait 的类型,其值是直接拷贝进 hash map
- 如果将值的引用插入哈希 map,这些值本身将不会被移动进 hash map (但是这些引用指向的值必须至少在 hash map 有效时也是有效的)