Повторение — деньги и валюта
Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 31 из 57.
Задание
СреднеСоздайте небольшую библиотеку для работы с деньгами в двух файлах.
Money.R: классMoney(слотыamount,currency) с правилом проверки допустимостиcurrency must be 3 capital letters(проверяйте с помощьюgrepl("^[A-Z]{3}$", ...)); методshow(), выводящий12.50 EURи новую строку;+для двух объектовMoney, который останавливается с сообщениемcannot add EUR and USD(используйтеcall. = FALSE); иArithдляMoneyи числа с помощьюcallGeneric().Convert.R: обобщённая функцияconvert(m, to, rates)с методом дляsignature("Money", "character"), который выполняет конвертацию через курсы, указывающие, сколько единиц каждой валюты составляют 1 EUR: 11 USD — это 10 EUR.
Предоставленный код хранит кошелёк и считывает команды add 10 EUR, sum (складывает весь кошелёк), convert 2 USD (второй элемент) или double 1, выводя каждый результат либо error: и сообщение.
Ваш код должен находиться в Money.R и Convert.R. В main.R находится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
source("Money.R")
source("Convert.R")
# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
rates <- c(EUR = 1, USD = 1.1, GBP = 0.85)
wallet <- list()
for (line in input) {
p <- strsplit(line, " ")[[1]]
out <- tryCatch({
if (p[1] == "add") {
m <- new("Money", amount = as.numeric(p[2]), currency = p[3])
wallet[[length(wallet) + 1]] <- m
print(m)
} else if (p[1] == "sum") {
print(Reduce(`+`, wallet))
} else if (p[1] == "convert") {
print(convert(wallet[[as.numeric(p[2])]], p[3], rates))
} else if (p[1] == "double") {
print(wallet[[as.numeric(p[2])]] * 2)
}
}, error = function(e) cat("error: ", sub(".*object: ", "", conditionMessage(e)), "\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()Повторение — расчёт зарплаты сотрудников6S4: обобщения и методы
Создание обобщенийМетоды для встроенных объектовДиспетчеризация по двум аргументамsetValidity и validObjectПовторение — деньги и валютаПотренируйтесь самостоятельно: Онлайн-компилятор R