rust笔记

Posted by fjw on May 29, 2022
rust笔记

Cargo.toml

标签

package

dependencies

Cargo.lock

  1. 可以保证二进制一致

  2. cargo update

    更新本地注册表, 更新Cargo.lock

常量

  1. 不可使用mut,常量永远是不可变的
  2. 声明常量使用const关键字,他的类型必须被标注
  3. 常量可以在任何作用域内进行声明,包括全局作用域
  4. 常量只可以绑定到敞亮表达式,无法绑定到函数的调用结果或只能在运行时才能计算出的值
  • 在程序运行期间,常量在其声明的作用域内一直有效
  • 命名规范: Rust里常量使用全大写字母,每个单词之间用下划线分开

  • 例子

    Const MAX_POINT:u32 = 100_000

数据类型

  • Rust 是静态编译语言,在编译时必须知道所有变量的类型
    1. 基于使用的值,编译器通常能推断出他的具体类型
    2. 如果可能的类型比较多,则必须添加类型的标注,否则编译报错。

标量类型

  • 标量类型代表单个的值。
  • Rust有4个主要的标量类型
    1. 整数类型
    2. 浮点类型
    3. 布尔类型
    4. 字符类型

整数类型

整数类型没有小数部分

整数字面值

  • 十进制
  • 16进制: 0x开头
  • 8进制: 0o开头
  • 2进制:0b开头
  • Byte(u8): 例如b'A'

除了 Byte 外,所有的数值字面值都允许使用类型后缀,如57u8

如果不清楚使用哪种可以使用rust相应的默认类型

整数的默认类型是i32,i32速度快,即使是64位系统

整数溢出

  • 调试模式

    运行时panic

  • release,不会检查整数溢出,溢出发生会进行环绕操作

浮点类型

f32和f64

f64是默认类型,因为两种速度差不多且f64精度更高

布尔类型

一个字节 符号bool

字符类型

  • rust语言中char类型被用来描述语言中最基础的单个字符
  • 占用4字节大小
  • Unicode标量值,可以表示逼ASCLL多得多的字符内容:拼音、中日韩文、0长度空白字符、emoji

复合类型

复合类型可以将多个值放在一个类型里

rust 提供两种基础的复合类型,元组(Tuple)、数组

Tuple

  • 可以将多个类型的多个值放在一个类型里
  • 长度固定,一旦声明就无法改变

数组

  • 将多个值放在一个类型里
  • 长度固定
  • 元素类型相同

Let a : [i32 : 5] = [1, 2, 3, 4, 5];

函数

  • 声明使用fn关键字

语句和表达式

  • 函数体是由一系列语句组成,可选的由一个表达式结束
  • 语句时执行一些动作的指令
  • 表达式会计算产生一个值

函数的返回值

  • ->后面声明函数返回值的类型,但是不可以为返回值命名

    1
    
    fn five() -> i32 { 5 }
    
  • Rust里面,返回值就是函数体里面最后一个表达式的值

  • 若想要提前返回使用return关键字,并指定一个值

控制流

if表达式

  • 条件必须是bool类型的

  • 与条件相关联的代码块叫做分支

    1
    2
    3
    4
    5
    
    if number < 5 {
      println!("condition was true");
    } else {
      println!("condition was false");
    }
    
  • 因为if 是个表达式,所以可以将它放在let语句等好的右边,代码块的返回类型要求一致

    1
    
    let number = if condition { 1 } else { 0 };
    

循环

loop

  • 使用break告诉程序停止循环

while条件循环

1
while condition {}

for循环遍历集合

1
2
3
4
5
6
fn main() {
  let a = [1, 2, 3, 4, 5];
  for element in a.iter() {   // element是一个引用 &i32
    println!("value is {}", element);
  }
}

Range

  • prelude提供

  • 指定开始和结束, range生成它们之间的数字(不含结束)

  • rev可以反转range

    1
    2
    3
    4
    5
    
    fn main() {
      for element in (1..6).rev() {
        println!("value is {}", element);
      }
    }
    

所有权

  • rust的核心特性