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; 或传参会转移值的所有权,原变量将失效(编译器确保安全)。