مراجعة - عدّاد مواقف السيارات
جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 21 من 57.
التحدي
متوسطأكمل دالة المصنع make_meter(rate) في Meter.R. rate هو عدد الدقائق التي تشتريها سنت واحد؛ اقفله باستخدام lockBinding() داخل دالة المصنع حتى لا يمكن تغييره مطلقًا. يحتفظ العداد بالدقائق المتبقية والسنتات المدفوعة كمتغيرات خاصة، ويعيد أربع دوال:
insert(cents)يقبل فقط 10 أو 20 أو 50 أو 100، وإلا يتوقف معcoin not accepted؛ يضيف كل نقدcents * rateمن الدقائق ويُحتسب ضمن المبلغ المدفوع.wait(minutes)يتيح مرور الوقت: تنخفض الدقائق المتبقية، ولكن لا تقل أبدًا عن 0. يؤدي الانتظار بقيمة سالبة إلى التوقف معtime cannot go back.status()يعيد12 min left، أوexpiredعند عدم بقاء أي وقت.paid()يعيد السنتات المدفوعة.
استخدم call. = FALSE. يقرأ الكود المزوَّد قيمة المعدل، ثم يقرأ الأسطر coin 20 أو wait 5، ويطبع الحالة أو error: والرسالة بعد كل منها. وأخيرًا يطبع المبلغ المدفوع ويحاول تغيير rate داخل بيئة دالة المصنع.
ضع الكود في Meter.R. يحتوي main.R على كود الإدخال/الإخراج المزوَّد ولا يمكن تعديله.
جرّب بنفسك
source("Meter.R")
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
meter <- make_meter(as.numeric(input[1]))
for (line in input[-1]) {
p <- strsplit(line, " ")[[1]]
msg <- tryCatch({
if (p[1] == "coin") meter$insert(as.numeric(p[2]))
if (p[1] == "wait") meter$wait(as.numeric(p[2]))
meter$status()
}, error = function(e) paste("error:", conditionMessage(e)))
cat(line, ": ", msg, "\n", sep = "")
}
cat("paid: ", meter$paid(), " cents\n", sep = "")
r <- tryCatch({ environment(meter$insert)$rate <- 0; "rate changed" }, error = function(e) "rate is locked")
cat(r, "\n", sep = "")
جميع دروس البرمجة كائنية التوجه
1أساسيات S3
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكالتدرّب بنفسك: مترجم R عبر الإنترنت