Vector通过简称Vec,是Rust标准库提供的一个标准动态数组类型,并且可以存储不同的数据类型
创建Vec
fn main() {
// 创建一个不可变的空数组:没有意义
let vec: Vec<i32> = Vec::new();
// 创建一个可变的空数组
let mut vec: Vec<u8> = Vec::new();
vec.push(1);
vec.push(2);
// 创建包含初始值的数组
let mut vec: Vec<i32> = vec![1, 2, 3];
}
读取Vec
- 通过索引下标读取
- 通过
match匹配 - 通过
for in循环读取变量
fn main() {
let mut vec: Vec<i32> = vec![1, 2, 3];
let i = vec[0]; // 取出来的值
let j = &vec[1]; // 取出来的是引用
// 索引读取元素
println!("{}", i);
println!("{}", j); // 这里内含了自动解引用
println!("{}", *j); // 实际应该解引用才能访问具体的值
// match匹配元素:即时数组下标越界了也不会导致程序崩溃
match vec.get(4) {
None => { println!("the value is nil") }
Some(val) => { println!("{}", val) }
}
// 不可变的遍历:如果不声明为引用遍历,下面就不能再使用vec了(所有权被转移,并在表达式结束后被系统回收)
for i in &vec {
println!("不可变遍历: {}", i)
}
// 可变的遍历
for i in &mut vec {
*i += 10;
println!("可变遍历: {}", i)
}
}
vec与枚举
可以借助枚举来存储不同的数据类型
enum Context {
Text(String),
Int(i32),
Float(f64),
Bool(bool),
}
fn main() {
let mut vec: Vec<Context> = Vec::new();
vec.push(Context::Text("字符串类型".to_string()));
vec.push(Context::Int(10086));
vec.push(Context::Float(3.14));
vec.push(Context::Bool(true));
}
可变引用与不可变引用
当出现可变引用后之前的不可变引用不能再使用
fn main() {
let mut vec: Vec<String> = vec!["1".to_string(), "2".to_string()];
let i = &vec[0]; // 不可变引用
println!("{}", i);
// 编译时报错:mutable borrow occurs here
vec.push("3".to_string()); // 可变引用
println!("{}", i);
}
重新访问可以再使用
fn main() {
let mut vec: Vec<String> = vec!["1".to_string(), "2".to_string()];
let i = &vec[0]; // 不可变引用
println!("{}", i);
vec.push("3".to_string()); // 可变引用
let i = &vec[0]; // 重新访问不可变引用
println!("{}", i);
}