Rust 是一门以内存安全和性能著称的现代编程语言,而 Vec 是 Rust 中最常用的动态数组类型,灵活又高效。无论你是想存储一串数字、字符串,还是管理动态数据,Vec 都是你的好帮手!
想象你需要一个“伸缩自如的口袋”,可以随时装入或取出东西。Rust 的 Vec 就像这样的口袋,它是一个动态数组,能根据需要自动扩展或收缩。本文将通过简单示例,教你如何创建、操作 Vec,并理解 Rust 的内存安全。
Vec 基础概念Vec 是 Rust 提供的动态数组类型,存储在堆内存上,可以动态增长或缩小。与固定长度的数组(如 [i32; 3])不同,Vec 的大小可以随时变化,非常适合处理动态数据。为什么选择 Vec?
所有权与借用Rust 的所有权规则对 Vec 至关重要:
可以通过std::vec 文档深入了解。
让我们通过三个简单示例,学习 Vec 的核心操作。代码都可以在 src/main.rs 中运行。
示例 1:创建和初始化 Vec
fn main() {
// 创建空的 Vec
let mut numbers: Vec<i32> = Vec::new();
// 添加元素
numbers.push(1);
numbers.push(2);
numbers.push(3);
println!("Numbers: {:?}", numbers); // 输出: Numbers: [1, 2, 3]
// 使用 vec! 宏快速初始化
let fruits = vec!["apple", "banana", "orange"];
println!("Fruits: {:?}", fruits); // 输出: Fruits: ["apple", "banana", "orange"]
}解释:
示例 2:操作与迭代
fn main() {
let mut scores = vec![85, 90, 95];
// 删除元素
scores.remove(1); // 删除索引 1 的元素(90)
println!("After remove: {:?}", scores); // 输出: [85, 95]
// 迭代 Vec
for score in &scores {
println!("Score: {}", score);
}
// 可变借用修改元素
for score in &mut scores {
*score += 5; // 每个分数加 5
}
println!("After increase: {:?}", scores); // 输出: [90, 100]
}解释:
示例 3:处理用户输入假设我们要存储用户输入的待办事项列表:
use std::io;
fn main() {
let mut todos: Vec<String> = Vec::new();
// 模拟用户输入
println!("Enter a todo item (or 'quit' to exit):");
loop {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read input");
let input = input.trim();
if input == "quit" {
break;
}
todos.push(input.to_string());
}
println!("Your todos: {:?}", todos);
}解释:
常见问题与调试
总结与扩展恭喜你掌握了 Vec 的基本用法!通过本教程,你学会了创建、操作 Vec,并理解了 Rust 的所有权和借用机制。Vec 是 Rust 编程的基石,广泛用于数据存储和处理。扩展任务: