rust学习笔记4-基础类型2和内存管理模型

发布于:2025-02-24 ⋅ 阅读:(13) ⋅ 点赞:(0)

rust和其他语言一样除了基本的整型、浮点型、布尔、字符外也有复合类型、集合类型等复杂类型

1.复合类型数组和元组

数组不用过多介绍,但元组不是所有语言都有,目前我学的语言只有python,rust有这个类型

与数组相比相同点:都是复合类型、长度都是固定的,不同点在于元组可以是不同类型的数据类型,数组必须同一类型的数据类型。

数组声明与使用

fn main() {
   //声明 a 是一个长度为 5 的整型数组
   let a = [1, 2, 3, 4, 5];
   //声明b 是一个长度为3的字符串数组
   let b = ["python", "go", "rust"];
   // 等同于 let c = [3, 3, 3, 3, 3];
   let c = [3; 5];
   //访问
   println!("{}",a[0]);
   //a[0] = 123; //同样如果没有mut:数组 a 不可变,不可改变里面的值
   let mut a = [1, 2, 3]; //加了mut才能修改
   a[0] = 4; // 正确
   //循环遍历
   for i in a.iter() {
    println!("值为 : {}", i);
   }
}

元组声明与使用

fn main() {
   //声明一个元组tuple
   let tuple = (1, "beijing", true, 0.9);
   //访问
   println!("{}", tuple.0);
   /*元组不可遍历和切片(这点与python中的元组有很大不同)
    Rust中的元组不能直接进行遍历。元组是一个固定长度的、可以包含不同类型元素的复合类型。
    不能使用for循环直接遍历元组,因为元组没有实现Iterator trait。
    元组也不能像数组那样进行切片操作。只能通过索引来访问元组中的单个元素,索引从0开始,
    使用点号(.)来访问,例如:tuple.0,tuple.1等。
    如果你需要遍历或切片操作,有以下替代方案:
        1.如果需要遍历,可以将元组转换为数组(要求数据类型相同)
        2.如果元素类型相同,考虑使用数组或Vec替代元组
        3.可以使用模式匹配来一次性获取多个元素
    */
    // 使用模式匹配解构元组
    let(a,b,c,d) = tuple;
    println!("a: {}, b: {}, c: {}, d:{}", a, b, c, d);

}

2.内存管理模型

其他语言内存管理方式
1.C/C++ 纯手工管理内存(缺乏安全抽象模型),容易出错
2.以Java/Python/Go等于语言,采用gc管理:垃圾回收,虽然内存安全,
但是有(stop the world),对性能影响非常大
rust语言内存管理方式
1.考虑性能,借鉴c++的rall资源管理方式
2.考虑安全:增加所有权语义

所有权的三大核心规则
    1.每个值有且只有一个所有者
    值在任意时刻只能被一个变量拥有,所有者负责值的生命周期。
    2.所有者离开作用域时,值会被自动释放
    通过 Drop trait 自动调用清理代码(如释放内存)。
    3.所有权可通过赋值或函数传递转移(Move)
    赋值 let x = y; 或传参会转移值的所有权,原变量将失效(编译器确保安全)。