返回
Rust 写一个命令行 TODO List 进阶:优化与实战
前端
2023-07-29 13:03:47
用 Rust 打造功能齐全的命令行 TODO 列表
解决遗留问题
在打造 Rust 命令行 TODO 列表时,我们遇到了两个遗留问题:
- 任务完成状态的持久化: 任务完成状态没有保存,导致程序退出后所有任务重置为未完成。
- 任务优先级的排序: 任务没有按优先级排序,导致无法轻松查看高优先级任务。
为了解决这些问题,我们使用了持久化库将任务状态保存到文件中,并使用了排序库实现任务优先级的排序。
优化代码
为了使代码更简洁高效,我们采用了以下优化措施:
- 简洁的语法: 使用 Rust 的灵活语法结构,重构代码使其更易于阅读和理解。
- 高效的数据结构: 使用更高效的数据结构存储任务,提高程序性能。
实现更高级的功能
除了解决遗留问题和优化代码外,我们还实现了更高级的功能:
- 任务分组: 允许用户将任务分组到不同类别,以便更轻松地管理任务。
- 任务提醒: 用户可以设置任务提醒时间,以便在任务到期时收到提醒。
- 任务导出和导入: 允许用户将任务导出到文件中,并在其他设备上导入和使用。
示例代码
use std::{collections::HashMap, fs};
// 定义任务结构
#[derive(Debug)]
struct Task {
name: String,
description: String,
priority: u8,
completed: bool,
}
// 定义 TODO 列表结构
#[derive(Debug)]
struct TodoList {
tasks: HashMap<u64, Task>,
}
// 实现 TODO 列表方法
impl TodoList {
// 从文件中加载 TODO 列表
fn load_from_file(file_name: &str) -> Result<Self, std::io::Error> {
let file_content = fs::read_to_string(file_name)?;
let tasks: HashMap<u64, Task> = serde_json::from_str(&file_content)?;
Ok(TodoList { tasks })
}
// 将 TODO 列表保存到文件
fn save_to_file(&self, file_name: &str) -> Result<(), std::io::Error> {
let file_content = serde_json::to_string(&self.tasks)?;
fs::write(file_name, file_content)?;
Ok(())
}
// 添加任务
fn add_task(&mut self, task: Task) {
let task_id = self.tasks.len() as u64 + 1;
self.tasks.insert(task_id, task);
}
// 获取所有任务
fn get_tasks(&self) -> &HashMap<u64, Task> {
&self.tasks
}
// 根据任务 ID 获取任务
fn get_task(&self, task_id: u64) -> Option<&Task> {
self.tasks.get(&task_id)
}
// 删除任务
fn delete_task(&mut self, task_id: u64) {
self.tasks.remove(&task_id);
}
// 标记任务为完成
fn mark_task_completed(&mut self, task_id: u64) {
if let Some(task) = self.tasks.get_mut(&task_id) {
task.completed = true;
}
}
}
fn main() {
// 创建一个新的 TODO 列表
let mut todo_list = TodoList { tasks: HashMap::new() };
// 从文件中加载 TODO 列表
match TodoList::load_from_file("todo_list.json") {
Ok(loaded_list) => todo_list = loaded_list,
Err(e) => println!("无法加载 TODO 列表:{}", e),
}
// 添加一些任务
todo_list.add_task(Task {
name: "任务 1".to_string(),
description: " 1".to_string(),
priority: 1,
completed: false,
});
todo_list.add_task(Task {
name: "任务 2".to_string(),
description: " 2".to_string(),
priority: 2,
completed: false,
});
// 获取所有任务
let tasks = todo_list.get_tasks();
// 遍历任务并打印
for (task_id, task) in tasks.iter() {
println!("任务 ID:{},名称:{},{},优先级:{},完成状态:{}", task_id, task.name, task.description, task.priority, task.completed);
}
// 将 TODO 列表保存到文件
match todo_list.save_to_file("todo_list.json") {
Ok(_) => println!("TODO 列表已保存到文件"),
Err(e) => println!("无法保存 TODO 列表:{}", e),
}
}
结语
通过解决遗留问题、优化代码并实现更高级的功能,我们打造了一个功能齐全、易于使用的 Rust 命令行 TODO 列表。它可以帮助你高效管理任务,提升工作效率。
常见问题解答
-
如何持久化任务的完成状态?
我们使用持久化库将任务状态保存到文件中。
-
如何对任务进行优先级排序?
我们使用排序库实现了任务优先级的排序功能。
-
如何将任务分组到不同的类别中?
我们使用 HashMap 来存储任务,并根据类别进行分组。
-
如何设置任务提醒?
我们使用第三方库来设置和管理任务提醒。
-
如何导出和导入任务?
我们使用 JSON 格式来导出和导入任务。