Vector 是《Rust 程序设计语言》第8.1章 使用 Vector 储存列表
而来的结果
我想强调是,书中这一章节主要是在讲集合,集合是一种存储数据的容器,
我把它理解为一种工具,对于这种工具我们不用太过纠结其原理,只要大致了解下它有什么用,怎么用,在适合的时候,能想的起来应该用它就行
Vector 的特点: 只能储存相同类型的值,Vector 可以理解为一个动态数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
fn main() {
// 注意这里我们增加了一个类型注解。
// 因为没有向这个 vector 中插入任何值,Rust 并不知道我们想要储存什么类型的元素。
// 这是一个非常重要的点。vector 是用泛型实现的
// 所有你需要知道的就是 Vec 是一个由标准库提供的类型,它可以存放任何类型。
// 而当 Vec 存放某个特定类型时,那个类型位于尖括号中。
// 在更实际的代码中,一旦插入值 Rust 就可以推断出想要存放的类型,所以你很少会需要这些类型注解。
let v1: Vec<i32> = Vec::new(); // 创建一个只能装i32类型的Vector容器
println!("{:?}", v1);
// 更常见的做法是使用初始值来创建一个 Vec,而且为了方便 Rust 提供了 vec! 宏。
// 这个宏会根据我们提供的值来创建一个新的 Vec。
let v2 = vec![1, 2, 3];
println!("{:?}", v2);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
fn main() {
// 对于新建一个 vector 并向其增加元素,可以使用 push 方法。
let mut v3: Vec<i32> = Vec::new();
v3.push(1);
v3.push(2);
v3.push(3);
v3.push(4);
println!("{:?}", v3);
// 读取
// 索引语法,这种方法当你引用一个不存在的索引会引发panic异常,不推荐
let v4 = vec![1, 2, 3, 4, 5];
let third: &i32 = &v4[2];
println!("The third element is {}", third);
// 使用 Vector 的 get 方法,这种方法当你引用一个不存在的索引会返回None
match v4.get(2) {
Some(third) => println!("The third element is {}", third),
None => println!("There is no third element."),
}
// Rust 有两个引用元素的方法的原因是程序可以选择如何处理当索引值在 vector 中没有对应值的情况。
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
fn main() {
// 不能修改
let v5 = vec![1, 2, 3, 4, 5];
for i in v5 {
println!("{}", i);
}
// 遍历其可变引用并修改它
let mut v6 = vec![1, 2, 3, 4, 5];
for i in &mut v6 {
*i += 50; // 为了修改可变引用所指向的值,在使用 += 运算符之前必须使用解引用运算符(*)获取 i 中的值。
println!("{}", i);
}
}
|
- Vector 也可以通过枚举来让它存储多个类型,不过我不建议这么做
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#[derive(Debug)]
enum SpreadsheetCell {
Int(i32),
Float(f64),
Text(String),
}
fn main() {
let row = vec![
SpreadsheetCell::Int(3),
SpreadsheetCell::Text(String::from("blue")),
SpreadsheetCell::Float(10.12),
];
for i in row {
println!("{:?}", i);
}
}
|