復習 - お金と通貨
CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 31/57。
チャレンジ
中級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オンラインコンパイラ