Menu
CoddyTech

回顾:任务队列

本课属于 Coddy R 学习旅程的“面向对象编程”单元。第 41 课,共 57 课。

challenge icon

挑战

中等

使用两个引用类构建任务队列。两个类定义都用 suppressMessages() 包裹。

  • Task 在 Task.R 中:包含字段 title、priority(数值型)和 done(逻辑型);如果没有提供 done,initialize 会将其设为 FALSE;已完成任务的 label() 会返回 [x] fix (3) 或 [ ] fix (3)。
  • TaskQueue 在 TaskQueue.R 中:包含字段 tasks(一个 list);add(title, priority) 会添加一个新的 Task,并返回 invisible(.self);next_task() 会返回优先级最高的未完成任务的标题(优先级相同时返回最早添加的任务),如果没有则返回 nothing;complete(title) 会将第一个标题匹配的未完成任务标记为已完成,并返回 TRUE,否则返回 FALSE;report() 会按添加顺序为每个任务返回一个标签,然后返回 open: 2。

提供的代码会读取 add fix 3、next 和 done fix,然后通过一次链式调用添加两个任务,并打印报告。

你的代码应写在 Task.R 和 TaskQueue.R 中。main.R 包含提供的输入/输出代码,不能编辑。

亲手试试

source("Task.R")
source("TaskQueue.R")

# 提供的输入/输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
q <- TaskQueue$new()
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  if (p[1] == "add") {
    q$add(p[2], as.numeric(p[3]))
  } else if (p[1] == "next") {
    cat("next: ", q$next_task(), "\n", sep = "")
  } else if (p[1] == "done") {
    cat(if (q$complete(p[2])) "completed " else "no open task ", p[2], "\n", sep = "")
  }
}
q$add("late", 1)$add("later", 1)
writeLines(q$report())

面向对象编程中的所有课

自己练习: R 在线编译器