2.2 数据类型:标量与复合类型

Rust 是一门静态类型语言,这意味着在编译时就必须知道每个变量的类型。不过,Rust 编译器通常能根据上下文自动推断出类型,因此你不必总是显式写出类型标注。

Rust 的数据类型分为两大类:标量类型(scalar)和复合类型(compound)。标量类型表示单一值,而复合类型可以将多个值组合成一个类型。

标量类型

Rust 提供了四种主要的标量类型:整数、浮点数、布尔值和字符。

整数类型

整数是没有小数部分的数字。Rust 支持有符号(signed)和无符号(unsigned)整数,长度从 8 位到 128 位不等:

  • 有符号:i8, i16, i32, i64, i128, isize
  • 无符号:u8, u16, u32, u64, u128, usize

其中 isizeusize 的大小取决于程序运行的系统架构(32 位或 64 位)。

如果不显式指定类型,整数字面量默认为 i32。例如:

let x = 42;        // i32
let y: u8 = 255;   // 显式指定为 u8

浮点数类型

Rust 有两种浮点类型:f32f64,分别对应单精度和双精度浮点数。默认情况下,浮点字面量是 f64

let a = 3.14;      // f64
let b: f32 = 2.718;

布尔类型

布尔类型 bool 只有两个可能的值:truefalse

let is_rust_cool = true;

字符类型

Rust 的 char 类型表示一个 Unicode 标量值,用单引号括起来。它不仅包括 ASCII 字符,还支持 emoji 等 Unicode 字符:

let c = 'z';
let emoji = '🚀';

注意:char 是 32 位大小,足以容纳任何有效的 Unicode 字符。

复合类型

复合类型可以将多个值组合为一个类型。Rust 提供了两种原生复合类型:元组(tuple)和数组(array)。

元组

元组将多个不同类型的值组合成一个单一类型。一旦声明,元组的长度是固定的。

let tup: (i32, f64, char) = (500, 6.4, 'a');

可以通过模式解构或点号加索引来访问元组中的元素:

let (x, y, z) = tup;
println!("y is {}", y);

let second = tup.1; // 访问第二个元素(从 0 开始)

数组

数组用于存储多个相同类型的元素,其长度在编译时确定且不可更改:

let a = [1, 2, 3, 4, 5];
let b: [i32; 5] = [1, 2, 3, 4, 5]; // 显式指定类型和长度

访问数组元素使用方括号语法:

let first = a[0];

需要注意的是,Rust 在运行时会对数组索引进行边界检查。如果访问越界,程序会 panic 并终止,从而避免缓冲区溢出等安全问题。

小结

Rust 的类型系统在保证安全的同时提供了丰富的表达能力。理解标量类型和复合类型的基本用法,是编写正确、高效 Rust 代码的重要基础。在后续章节中,我们还会接触到更多类型,如字符串、向量和结构体等。

#Rust 入门教程 分享于 2 周前

内容由 AI 创作和分享,仅供参考