在 Rust 中,每一个值都属于某一个 数据类型(data type),这告诉 Rust 它被指定为何种数据,以便明确数据处理方式。我们将看到两类数据类型子集:标量(scalar)和复合(compound)。
Rust 是 静态类型(statically typed)语言,也就是说在编译时就必须知道所有变量的类型。根据值及其使用方式,编译器通常可以推断出我们想要用的类型。但是很多时候存在多种类型都有可能的情况。
// fail 会发生编译错误
let guess = "42".parse().expect("Not a number!")
// success
let guess: u32 = "42".parse().expect("Not a number!")
标量类型
标量(scalar)类型代表一个单独的值。Rust 有四种基本的标量类型。
类型名称 |
---|
整型 |
浮点型 |
布尔型 |
字符类型 |
整型
整型 是一个
没有小数部分的数字
,并且通过u
来决定整型是否是带符号。
有符号
和无符号
代表数字能否为负值
长度 | 有符号 | 无符号 |
---|---|---|
8-bit | i8 | u8 |
16-bit | i16 | u16 |
32-bit | i32 | u32 |
64-bit | i64 | u64 |
arch | size | usize |
整型溢出
一个u8类型的整型最多放255,如果放入256,就会导致
“整型溢出”(“integer overflow” )
浮点型
Rust 也有两个原生的 浮点数(floating-point numbers)类型,它们是带小数点的数字。Rust 的浮点数类型是 f32 和 f64,分别占 32 位和 64 位。默认类型是 f64,因为在现代 CPU 中,它与 f32 速度几乎一样,不过精度更高。
数值运算
+ | - | * | %
布尔型
true / false
字符类型
Rust 的 char 类型是语言中最原生的字母类型,
char 由单引号指定,不同于字符串使用双引号
fn main() {
let c = 'z';
let z = 'ℤ';
let heart_eyed_cat = '😻';
}
复合类型
复合类型(Compound types)可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array)。
元组
元组是一个将多个其他类型的值组合进一个复合类型的主要方式。
我们使用包含在圆括号中的逗号分隔的值列表来创建一个元组。元组中的每一个位置都有一个类型,而且这些不同值的类型也不必是相同的。
fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1);
}
tup 变量绑定到整个元组上,因为元组是一个单独的复合元素。为了从元组中获取单个值,可以使用模式匹配(pattern matching)来解构(destructure)元组值
fn main() {
let tup = (500, 6.4, 1);
let (x, y, z) = tup;
println!("The value of y is: {}", y);
}
数组
另一个包含多个值的方式是 数组(array)。与元组不同,数组中的每个元素的类型必须相同。Rust 中的数组与一些其他语言中的数组不同,因为 Rust 中的数组是固定长度的:一旦声明,它们的长度不能增长或缩小。
let a: [i32; 5] = [1, 2, 3, 4, 5];
当你想要在
栈(stack)而不是在堆(heap)
上为数据分配空间,或者是想要确保总是有固定数量的元素
时,数组非常有用。但是数组并不如 vector 类型灵活。vector 类型是标准库提供的一个 允许 增长和缩小长度的类似数组的集合类型
。当不确定是应该使用数组还是 vector 的时候,你可能应该使用 vector。