Day 5:完成與刪除任務

學習目標

  • 實作標記完成
  • 實作刪除任務
  • 用 Option 處理「找不到」的情況

今日重點

標記完成

impl TaskStore {
    fn mark_done(&mut self, id: u64) -> Option<()> {
        let task = self.tasks.iter_mut().find(|t| t.id == id)?;
        task.done = true;
        Some(())
    }
}

? 後接 iter_mut().find(),若找不到回傳 None;找到就改 done。

刪除任務

impl TaskStore {
    fn remove(&mut self, id: u64) -> Option<Task> {
        let pos = self.tasks.iter().position(|t| t.id == id)?;
        Some(self.tasks.remove(pos))
    }
}

對應 CLI(處理找不到)

match cli.command {
    Command::Done { id } => {
        if store.mark_done(id).is_some() {
            println!("任務 #{} 已標記完成!", id);
        } else {
            eprintln!("找不到任務 #{}", id);
        }
    }
    Command::Remove { id } => {
        if let Some(removed) = store.remove(id) {
            println!("已刪除:{}", removed.title);
        } else {
            eprintln!("找不到任務 #{}", id);
        }
    }
    _ => {}
}

練習

  1. 完成 mark_done 與 remove 方法。
  2. 接上 Done / Remove 指令並正確處理找不到。
  3. 測試:新增 → 完成 → 刪除。

自我檢查

  • 能標記任務完成
  • 能刪除任務
  • 用 Option 處理找不到的情況
  • 所有 CRUD 操作齊備(記憶體版)