Повторение — парковочный счётчик
Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 21 из 57.
Задание
СреднеЗавершите фабрику make_meter(rate) в Meter.R. rate — это количество минут, которое покупает один цент; заблокируйте его с помощью lockBinding() внутри фабрики, чтобы его нельзя было изменить. Счётчик хранит оставшиеся минуты и уплаченные центы в качестве приватных переменных и возвращает четыре функции:
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 = "")
Все уроки раздела Объектно-ориентированное программирование
1Основы S3
Работа с файламиСписки с классомФункции-конструкторыМетоды print и formatВалидаторы и вспомогательные функцииПовторение — температуры4Инкапсуляция в R
Замыкания как объектыОкружения как объектыФункции доступаЗащита состоянияПовторение — парковочный счётчик7S4 Наследование
Расширение с помощью containscallNextMethodВиртуальные классыПроверка типов с помощью is()Повторение — смотритель зоопарка10Шаблоны проектирования, часть 2
Шаблон «Декоратор»Шаблон «Строитель»Шаблон «Состояние»Шаблон «Итератор»2Обобщённые функции и методы S3
Обобщённые функции и UseMethodМетоды по умолчаниюМетоды для базовых обобщённых функцийОсновы NextMethodПовторение — площади фигур5Классы S4
Определение классов S4Слоты и доступПроверка корректностиМетоды showПовторение — каталог товаров8Ссылочные классы
Определение ссылочных классовМетоды и обновление полейСемантика копированияНаследование и callSuperПовторение — очередь задач11Проект: Управление библиотекой
Книги и читателиВыдача книг3Наследование S3
Векторы классовПорядок поиска методовРасширение с помощью NextMethodПроверка с помощью inherits()Повторение — расчёт зарплаты сотрудниковПотренируйтесь самостоятельно: Онлайн-компилятор R