回顾:货币与币种
本课属于 Coddy R 学习旅程的“面向对象编程”单元。第 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);还要为Money和数字定义Arith,并使用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 = ""))
}
面向对象编程中的所有课
自己练习: R 在线编译器