Menu
Coddy logo textTech

復習 - お金と通貨

CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 31/57。

challenge icon

チャレンジ

中級

2つのファイルで小さな通貨ライブラリを作成します。

  • Money.R: クラス Money(スロット amount、currency)を作成し、currency must be 3 capital letters という妥当性ルール(grepl("^[A-Z]{3}$", ...) でチェック)を設定します。また、12.50 EUR と改行を出力する show() メソッド、2つの Money オブジェクトに対する +(cannot add EUR and USD で停止し、call. = FALSE を使用)、および callGeneric() を使って Money と数値を扱う Arith を実装します。
  • Convert.R: ジェネリック関数 convert(m, to, rates) と、signature("Money", "character") に対するメソッドを作成します。このメソッドは、各通貨が1 EURに相当する単位数を示すレートを通じて変換します。つまり、11 USD は10 EURです。

提供されたコードはウォレットを保持し、add 10 EUR、sum(ウォレット全体を加算)、convert 2 USD(2番目の項目)、または 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オンラインコンパイラ