RUST基础知识

204 阅读6分钟

变量和可变性

变量(variables)

  • 变量是绑定到一个变量名且不允许更改的值
  • 变量默认不可变
  • let 关键字
  • 变量名前加上 mut 使得它们可变
    • 向以后的读代码的人传达了代码的其他部分将会改变这个变量值
    • 使用大型数据结构的情形下,在同一位置更改实例可能比复制并返回新分配的实例要更快。
    • 使用较小的数据结构时,通常创建新的实例并以更具函数式编程的风格来编写程序,可能会更容易理解,所以值得以较低的性能开销来确保代码清晰

常量(constant)

  • 常量是绑定到一个常量名且不允许更改的值
  • 常量始终不可变
  • 命名预定时全部字母大写,并使用下划线分割单词
  • const 关键字
  • 值的类型必须注明
  • 常量可以在任何作用域进行声明(包括全局作用域)
  • 常量只能设置为常量表达式,而不是函数调用的结果或运行时计算的得到的值
  • 声明作用域内,常量在整个程序运行过程中都生效

遮蔽(shadow)

  • 通过使用相同的变量名并重复使用 let 关键字来遮蔽变量
  • 通过使用 let,我们可以对一个值进行一些转换(包括类型转换),但在这些转换完成后,变量将是不可变的

数据类型

标量类型

整型

  • (有符号整型规定的数字范围是(2n1)2n11-(2^{n - 1}) — 2^{n-1}- 1, 无符号整型的数字范围是 02n110 — 2^{n-1}- 1
长度有符号类型(以二进制补码的形式存储)无符号类型
8 位i8u8
16 位i16u16
32 位i32u32
64 位i64u64
128 位i128u128
archisizeusize
  • 属于多种数字类型的数字字面量允许使用类型后缀来指定类型,例如 57u8
  • 数字字面量还可以使用 _ 作为可视分隔符以方便读数,如 1_000
  • 整型默认是 i32isize 和 usize 的主要应用场景是用作某些集合的索引。
数字字面量示例
十进制98_222
十六进制0xff
八进制0o77
二进制0b1111_0000
字节 (仅限于 u8)b'A'
  • 整型溢出
    • 在调试(debug)模式编译时,Rust 会检查整型溢出,若存在这些问题则使程序在编译时 panic

    • 在当使用 --release 参数进行发布(release)模式构建时,Rust 检测会导致 panic 的整型溢出。相反当检测到整型溢出时,Rust 会进行一种被称为二进制补码包裹(two’s complement wrapping)的操作

    • 要显式处理溢出的可能性,可以使用标准库针对原始数字类型提供的以下一系列方法:

      • 使用 wrapping_* 方法在所有模式下进行包裹,例如 wrapping_add
      • 如果使用 checked_* 方法时发生溢出,则返回 None 值
      • 使用 overflowing_* 方法返回该值和一个指示是否存在溢出的布尔值
      • 使用 saturating_* 方法使值达到最小值或最大值

浮点类型

  • 浮点数按照 IEEE-754 标准表示。f32 类型是单精度浮点型,f64 为双精度浮点型。

数学运算

  • 加法、减法、乘法、除法和取模运算

布尔类型

  • Rust 中的布尔类型使用 bool 声明

字符类型

  • char(字符)类型是该语言最基本的字母类型
  • char 字面量采用单引号括起来
  • 字符类型大小为 4 个字节

复合类型

元组

  • 长度固定,声明后,长度无法增长或缩小
  • 通过在小括号内写入以逗号分隔的值列表来创建一个元组
  • 元组中的每个位置都有一个类型,并且元组中不同值的类型不要求是相同的
  • 取值
    • 元组被认作是单个复合元素。 想从元组中获取个别值,我们可以使用模式匹配来解构(destructure)元组的一个值
    • 使用一个句点(.)连上要访问的值的索引来直接访问元组元素,元组中的第一个索引为 0。
  • 没有任何值的元组 () 是一种特殊的类型,只有一个值,也写成 ()。该类型被称为单元类型unit type),该值被称为单元值unit value)。如果表达式不返回任何其他值,就隐式地返回单元值

数组类型

  • 数组的每个元素必须具有相同的类型
  • 数组具有固定长度
  • 希望将数据分配到栈(stack)而不是堆(heap)时或者当你希望确保始终具有固定数量的元素时,使用数组
  • 或者当你希望确保始终具有固定数量的元素时,使用数组
//使用方括号编写数组的类型,其中包含每个元素的类型、分号,然后是数组中的元素数
 let a: [i32; 5] = [1, 2, 3, 4, 5];
 // 要为每个元素创建包含相同值的数组,可以指定初始值,后跟分号,然后在方括号中指定数组的长度
 let a = [3; 5];
  • 取值
    • 数组是可以在栈上分配的已知固定大小的单个内存块。可以使用索引访问数组的元素
    • 使用一个句点(.)连上要访问的值的索引来直接访问元组元素,元组中的第一个索引为 0。
    • 使用一个句点(.)连上要访问的值的索引来直接访问元组元素,元组中的第一个索引为 0。
  • 当你尝试使用索引访问元素时,Rust 将检查你指定的索引是否小于数组长度。如果索引大于或等于数组长度,Rust 会出现 panic

函数

  • 函数和变量名使用下划线命名法(snake case,直译为蛇形命名法)规范风格,所有字母都是小写并使用下划线分隔单词
  • 函数定义以 fn 开始,后跟着函数名和一对圆括号。大括号告诉编译器函数体在哪里开始和结束

参数

  • 参数是特殊变量,是函数签名的一部分。当函数拥有参数(形参)时,可以为这些参数提供具体的值(实参)
  • 在函数签名中,必须声明每个参数的类型

语句和表达式

  • 语句statement)是执行一些操作但不返回值的指令。表达式(expression)计算并产生一个值

带有返回值的函数

  • 函数可以向调用它的代码返回值。我们并不对返回值命名,但要在箭头(->)后声明它的类型
  • 函数的返回值等同于函数体最后一个表达式的值。使用 return 关键字和指定值,可以从函数中提前返回;但大部分函数隐式返回最后一个表达式