Rust学习
数据类型¶
| 标量类型 | 默认 | |
|---|---|---|
| 整数类型 | 无符号u32、有符号i32(8-128位) | i32 |
| 浮点类型 | 单精度f32、双精度f64 | f64 |
| 布尔类型 | true、false | |
| 字符类型 | 4字节大小 |
整数类型:
【字面值】除byte类型,都可以加类型后缀:57u8;
【整数溢出】会执行环绕:256变成0、257变成1;发布模式的溢出不会导致panic
| 复合类型 | ||
|---|---|---|
| 元祖 | 可以不同类型,长度固定 | |
| 数组 | 必须同一类型,长度固定 | [类型; 长度] |
【获取Tuple】:
fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1);
let (x, y, z) = tup;
println!("{} {} {}", tup.0, tup.1, tup.2);
}
let a: [f32; 3] = [0.0, 0.0, 0.0];
let b = [3; 5];
Rust越界时会报panic,不会访问越界的内存
函数¶
【函数的参数】包括形参(parameters)、实参(arguments),参数必须包括数据类型
【函数的返回值】提前返回使用return,最后返回用一个表达式
循环¶
【三种循环】loop、while、for
fn main() {
let a = [10, 20, 30, 40, 50];
for element in a.iter() {
println!("{}", element);
}
}
使用range
fn main() {
for num in (1..10).rev() {
println!("{} - {}", num, num * num);
}
}
所有权(Stack & Heap)¶
所有程序都必须管理它们使用计算机内存的方式:
- 有些语言有垃圾回收机制,程序运行时寻找不再使用的内存
- 其他语言中需要手动分配释放内存
- rust:内存通过所有权系统管理,所有权特性不会减慢程序运行速度
| Stack栈内存 | Heap堆内存 | |
|---|---|---|
| 存储方式 | 按照值的接收顺序存储,相反顺序移出(后进先出) | Heap内存组织性差,当把数据放入Heap时,会请求一定数量的空间 操作系统在Heap里找到一块足够大的空间,标记为在用,返回一个空间地址指针 |
| 叫法 | 添加数据叫“入栈”、移除数据叫“出栈 | 分配 |
| 存储类型 | 所有数据必须拥有已知的固定大小 (指针有已知固定大小,可以放在Stack) | 编译时大小未知的、运行时大小发生变化的必须放在Heap上 |
| 存储 | Stack压栈比Heap分配快(永远在Stack顶端) | 需要寻找一块足够大的空间存放数据,然后做好记录方便下次分配 |
| 访问 | 快 | 慢(需要通过指针) 由于缓存的存在,如果指令在内存中跳转次数越少,速度越快 |
| 函数调用 | 调用时:变量压栈 结束时:变量出栈 |
所有权(管理Heap数据)解决的问题:
- 跟踪代码哪些部分使用Heap
- 最小化Heap上重复数据量
- 清理Heap上未使用的数据以避免空间不足
所有权规则¶
- 每个值都有一个变量,这个变量是该值的所有者
- 每个值同时只能有一个所有者
- 当所有者超出作用域(
Scope)时,该值将被删除
变量作用域(Scope):程序中一个项目的有效范围