回顾:任务队列
本课属于 Coddy R 学习旅程的“面向对象编程”单元。第 41 课,共 57 课。
挑战
中等使用两个引用类构建任务队列。两个类定义都用 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 在线编译器