变量和可变性
变量(variables)
- 变量是绑定到一个变量名且不允许更改的值
- 变量默认不可变
- let 关键字
- 变量名前加上 mut 使得它们可变
- 向以后的读代码的人传达了代码的其他部分将会改变这个变量值
- 使用大型数据结构的情形下,在同一位置更改实例可能比复制并返回新分配的实例要更快。
- 使用较小的数据结构时,通常创建新的实例并以更具函数式编程的风格来编写程序,可能会更容易理解,所以值得以较低的性能开销来确保代码清晰
常量(constant)
- 常量是绑定到一个常量名且不允许更改的值
- 常量始终不可变
- 命名预定时全部字母大写,并使用下划线分割单词
- const 关键字
- 值的类型必须注明
- 常量可以在任何作用域进行声明(包括全局作用域)
- 常量只能设置为常量表达式,而不是函数调用的结果或运行时计算的得到的值
- 声明作用域内,常量在整个程序运行过程中都生效
遮蔽(shadow)
- 通过使用相同的变量名并重复使用 let 关键字来遮蔽变量
- 通过使用 let,我们可以对一个值进行一些转换(包括类型转换),但在这些转换完成后,变量将是不可变的
数据类型
标量类型
整型
- (有符号整型规定的数字范围是, 无符号整型的数字范围是
| 长度 | 有符号类型(以二进制补码的形式存储) | 无符号类型 |
|---|---|---|
| 8 位 | i8 | u8 |
| 16 位 | i16 | u16 |
| 32 位 | i32 | u32 |
| 64 位 | i64 | u64 |
| 128 位 | i128 | u128 |
| arch | isize | usize |
- 属于多种数字类型的数字字面量允许使用类型后缀来指定类型,例如
57u8 - 数字字面量还可以使用
_作为可视分隔符以方便读数,如1_000 - 整型默认是
i32。isize和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关键字和指定值,可以从函数中提前返回;但大部分函数隐式返回最后一个表达式