基本类型
Rust每个值都有其确切的数据类型,总的来说可以分为两类: 基本类型和复合类型。基本类型意味着它们往往是一个最小化原子类型,无法结构为其它类型,由以下组成: - 数值类型: 有符号整数(i8, i16, i32, i64, isize)、无符号整数(u8, u16, u32, u64, usize)、浮点数( f32, f64)、以及有理数、附属 - 字符串:字符串字面量和字符串切片 &str - 布尔类型: true 和 false - 字符类型:表示单个 Unicode 字符,存储为 4 个字节 - 单元类型:即 (),其唯一的值也是()
类型推导和标注
Rust 是一门静态类型的语言,也就是编译器必须在编译期知道我们所有变量的类型。它可以根据变量的值和上下文中的使用方式来自动推导出变量的类型。
数值类型
长度 | 有符号类型 | 无符号类型 |
---|---|---|
8位 | i8 | u8 |
16位 | i16 | u16 |
32位 | i32 | u32 |
64位 | i64 | u64 |
128位 | i128 | u128 |
视架构而定 | isize | usize |
类型定义的形式统一为:有无符号 + 类型大小(位数)
,整型默认使用 i32
.
整型溢出
当在 debug 模式编译时, Rust 会检查整型溢出,若存在这些问题,则使程序在编译时 panic。 在当使用 --release
参数进行 release 模式构建是,Rust 不检测溢出。相反,当检测到整型溢出时,Rust 会按照补码循环溢出的规则处理(例如 u8 的 256 = 0, 257 = 1)。
要显示处理可能的溢出,可以使用标准库针对原始数字类型提供的这些方法:
- 使用 wrapping_*
方法在所有模式下段兆补码循环溢出规则处理,例如 wrapping_add
- 如果使用 checked_*
方法时发生溢出,则返回 None
值
- 使用 overflowing_*
方法返回该值和一个指示是否存在溢出的布尔值
- 使用 saturating_*
方法使值达到最大值或最小值
浮点类型
在 Rust 中浮点类型数字也有两种基本类型:f32
和 f64
,分别为 32 位和 64 位大小。默认浮点类型是 f64
浮点数陷阱
浮点数由于底层格式的特殊性,导致了如果在使用浮点数不够谨慎,就可能造成危险,有两个原因: 1. 浮点数往往是数字的近似表达 浮点数是基于二进制实现的。 2. 浮点数在某些特性上是反直觉的。
为了避免以上陷阱,遵循以下准则: - 避免在浮点数上测试相等性 - 当结果在数学上可能存在未定义时,需要格外的小心
NaN
所有跟 NaN 交互的操作,都会返回一个 NaN
字符、布尔、单元类型
字符类型
字符类型占用 4 个字节,Rust 的字符只能用 ''
来表示,""
是留给字符串的
布尔
布尔值占用内存的大小为 1 个字节。
单元类型
单元类型就是 ()
语句和表达式
基于表达式是函数式语言的重要特征,表达式总是有返回值。
函数
函数要点
- 函数名和变量名使用蛇形命名法
- 函数的位置可以随意放,Rust 不关心我们在哪里定义了函数,只要有定义即可
- 每个函数参数都需要标注类型
函数参数
Rust 是强类型语言,因此需要为每一个参数都标识出它的具体类型。
fn main() {
another_function(5, 6.1);
}
fn another_function(x: i32, y: f32) {
println!("The value of x is: {}", x);
println!("The value of y is: {}", y);
}
函数返回
函数的返回值就是函数体最后一条表达式的返回值,当然我们也可以使用 return 提前返回