復習 - タスクキュー
CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 41/57。
チャレンジ
中級2つのリファレンスクラスからタスクキューを構築してください。どちらの定義も suppressMessages() でラップされています。
Task(Task.R内):フィールドはtitle、priority(数値)、done(論理値)です。initializeは、doneが指定されていない場合に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()は、追加された順に各タスクのラベルを1つずつ返し、その後にopen: 2を返します。
提供されたコードは add fix 3、next、done fix を読み取り、その後、連結された1回の呼び出しで2つのタスクを追加し、レポートを出力します。
コードは 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オンラインコンパイラ