一、vector
特点:一个挨着一个地存储一系列数量可变的值。
只能存储相同类型的值。
它在内存中彼此相邻地排列所有的值。
常见场景:文件中的文本,购物车中商品的价格。
vector是用泛型实现的。
let v: Vec
let v = vec![1, 2, 3,];
使用push方法更新值。
释放vec时会丢弃其所有元素。
如何读取vector元素值?
- 索引语法,即通过index访问,类似数组
- get方法,返回一个Option<&T>,所以通过match运算符去处理。
第一种获取元素的方法需要注意越位,会引起程序崩溃。即panic。
第二种则能很友好的在None的情况处理。
由于在同一作用域下不能同时存在可变和不可变引用,所以在获取vector元素的不可变引用时尝试在vector末尾增加元素,则会抛出异常。
在使用+=运算符之前必先用解引用运算符(*)获取i中的值。
vector + 枚举可以在vector中存放不同类型的数据。
二、字符串
特点:字符的集合。String。
let s = "initial contents".to_string();
// equal to
let s = String::from("initial contents");
Rust中字符串使用的是UTF-8编码。
如何更新字符串?
1. push_str,该方法不会获取到入参的所有权
2. push,该方法入参仅支持单个字符
3. + 运算符,String只能和&str 相加。
4. format! 宏,对于复杂的字符串处理,使用该方法最方便了,并且不会获取任何参数的所有权
当把一个类型为String的字符串取引用,并与类型为String的字符串相加时,第一个类型会被Deref强制转换成&str。
let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");
let s = format!("{}-{}-{}", s1, s2, s3);
Rust字符串String本质上是一个Vec
Rust中可以用三种方式可以理解字符串:
- 字节
- 标量值
- 字形簇(字母)
遍历字符串的方法:
1. .chars()
2. .bytes()
3. 获取字形簇可考虑crate.io上三方库
三、hash map
特点:允许将值与一个特定的键key关联,使用map数据结构。
生成一个map的方式:
use std::collections ::HashMap;
let mut scores = HashMap::new();
另一种方式:
use std::collections ::HashMap;
let teams = vec![String:: from("Blue"), String::from("Yellow")];
let initial_scores = vec![10, 50];
let scores: HashMap<_, _> = teams.iter().zip(initial_scores.iter()).collect();
通过.get(key)方法可返回一个Option<&T>,所以通过match运算符去处理。
类似于 vector,hash map 是同质的:所有的键必须是相同类型,值也必须都是相同类型
hash map与所有权
如果将值的引用插入哈希 map,这些值本身将不会被移动进哈希 map。但是这些引用指向的值必须至少在哈希 map 有效时也是有效的。
更新hash map
- 覆盖:
- 再次插入相同的key,即覆盖
- 只在键无对应值时插入:
- 使用.entry(key).or_insert(value)方法
- 使用此方法可快速依据可迭代结构更新hash map,并获取具体的键值
- 在旧值基础上更新值:
- 将一个键值取出来后,使用*号解引用,然后进行赋值操作即可完成更新