Menu
CoddyTech

回顾:货币与币种

本课属于 Coddy R 学习旅程的“面向对象编程”单元。第 31 课,共 57 课。

challenge icon

挑战

中等

用两个文件构建一个小型货币库。

  • 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 在线编译器