跳转至

Rust学习

数据类型

标量类型 默认
整数类型 无符号u32、有符号i32(8-128位) i32
浮点类型 单精度f32、双精度f64 f64
布尔类型 truefalse
字符类型 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,最后返回用一个表达式

循环

【三种循环】loopwhilefor

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数据)解决的问题:

  1. 跟踪代码哪些部分使用Heap
  2. 最小化Heap上重复数据量
  3. 清理Heap上未使用的数据以避免空间不足

所有权规则

  1. 每个值都有一个变量,这个变量是该值的所有者
  2. 每个值同时只能有一个所有者
  3. 当所有者超出作用域(Scope)时,该值将被删除

变量作用域(Scope):程序中一个项目的有效范围

String类型