返回

Rust 写一个命令行 TODO List 进阶:优化与实战

前端

用 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 列表。它可以帮助你高效管理任务,提升工作效率。

常见问题解答

  1. 如何持久化任务的完成状态?

    我们使用持久化库将任务状态保存到文件中。

  2. 如何对任务进行优先级排序?

    我们使用排序库实现了任务优先级的排序功能。

  3. 如何将任务分组到不同的类别中?

    我们使用 HashMap 来存储任务,并根据类别进行分组。

  4. 如何设置任务提醒?

    我们使用第三方库来设置和管理任务提醒。

  5. 如何导出和导入任务?

    我们使用 JSON 格式来导出和导入任务。