Rust 中的复合类型(Compound Types)用于将多个值组合在一起,是理解和使用 Rust 语言的基础。本文将详细介绍三种主要的复合类型:元组(Tuple)、数组(Array)和切片(Slice),并通过示例帮助你掌握它们的常见用法与差异。
一、元组(Tuple)
元组是可以包含多个不同类型的值的集合,适用于表示结构化但异构的数据。
示例:
fn main() {
let person: (u32, f64, char) = (30, 1.75, '男');
// 通过索引访问元素
println!("年龄: {}", person.0);
println!("身高: {}", person.1);
println!("性别: {}", person.2);
// 解构元组
let (age, height, gender) = person;
println!("解构后: {} {} {}", age, height, gender);
}
特殊的空元组:()
空元组称为 unit 类型,常见于没有返回值的函数中:
fn say_hello() {
println!("Hello");
// 实际返回值是 ()
}
二、数组(Array)
数组是长度固定、元素类型一致的数据集合,适用于处理已知数量的元素。
示例:
fn main() {
let scores: [i32; 5] = [90, 85, 70, 100, 95];
// 使用索引访问
println!("第一个分数: {}", scores[0]);
// 遍历数组
for score in scores.iter() {
println!("得分: {}", score);
}
// 初始化多个相同元素
let zeros = [0; 10]; // 创建包含 10 个 0 的数组
}
注意事项:
索引越界将触发 panic。
数组的长度是类型的一部分,因此 [i32; 3] 与 [i32; 4] 是不同的类型。
三、切片(Slice)
切片是数组或字符串的一部分视图,长度可变,但不拥有数据的所有权。
示例:数组切片
fn main() {
let arr = [10, 20, 30, 40, 50];
let slice: &[i32] = &arr[1..4];
println!("切片内容: {:?}", slice);
for item in slice {
println!("元素: {}", item);
}
}
示例:字符串切片
fn main() {
let s = String::from("hello rust");
let hello = &s[0..5]; // "hello"
let rust = &s[6..]; // "rust"
println!("{} - {}", hello, rust);
}
特点:
切片不会拥有数据,而是引用原始数据的一部分。
适用于函数参数中:
fn print_slice(slice: &[i32]) {
for item in slice {
println!("{}", item);
}
}
四、类型对比小结
总结
Rust 的复合类型为数据组织提供了灵活且安全的结构。从固定长度的数组,到灵活切片,再到可以混合不同类型的元组,掌握这些类型将帮助你更高效地处理数据结构。根据实际需求选择合适的类型,是写好 Rust 程序的重要基础。