復習 - パーキングメーター
CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 21/57。
チャレンジ
中級Meter.R のファクトリ make_meter(rate) を完成させてください。rate は 1 セントで購入できる分数です。ファクトリ内で lockBinding() を使ってロックし、決して変更できないようにしてください。メーターは残り時間と支払ったセント数をプライベート変数として保持し、4 つの関数を返します:
insert(cents)は 10、20、50、または 100 のみを受け付け、それ以外の場合はcoin not acceptedで停止します。各コインはcents * rate分を追加し、支払額にも加算します。wait(minutes)は時間を経過させます。残り時間は減少しますが、0 未満にはなりません。負の待ち時間を指定するとtime cannot go backで停止します。status()は12 min leftを返し、残り時間がない場合はexpiredを返します。paid()は支払ったセント数を返します。
call. = FALSE を使用してください。提供されたコードはレートを読み込み、その後 coin 20 や wait 5 などの行を読み取り、各行の後にステータス、または error: とメッセージを出力します。最後に支払額を出力し、ファクトリの環境内で rate の変更を試みます。
コードは Meter.R に記述してください。main.R には提供された入出力コードが含まれており、編集できません。
自分で試してみよう
source("Meter.R")
# 提供された入出力コード: そのままにしておく
input <- suppressWarnings(readLines(file("stdin")))
meter <- make_meter(as.numeric(input[1]))
for (line in input[-1]) {
p <- strsplit(line, " ")[[1]]
msg <- tryCatch({
if (p[1] == "coin") meter$insert(as.numeric(p[2]))
if (p[1] == "wait") meter$wait(as.numeric(p[2]))
meter$status()
}, error = function(e) paste("error:", conditionMessage(e)))
cat(line, ": ", msg, "\n", sep = "")
}
cat("paid: ", meter$paid(), " cents\n", sep = "")
r <- tryCatch({ environment(meter$insert)$rate <- 0; "rate changed" }, error = function(e) "rate is locked")
cat(r, "\n", sep = "")
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ