[rust]Vector

237 阅读2分钟

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

  1. 通过索引下标读取
  2. 通过match匹配
  3. 通过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);
}