الخانات وطرق الوصول
جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 23 من 57.
obj@slot <- value يغيّر خانة. مثل كائنات S3، كائنات S4 هي قيم: الدالة التي تغيّر أحدها تعمل على نسختها الخاصة وتعيدها:
setClass("Person", slots = c(name = "character", age = "numeric"))
birthday <- function(p) {
p@age <- p@age + 1
p
}
ada <- new("Person", name = "Ada", age = 36)
older <- birthday(ada)
cat(ada@age, older@age)الناتج:
36 37slot(obj, "name") تؤدي الوظيفة نفسها التي تؤديها @ مع اسم الفتحة في سلسلة نصية، لذا فهي تعمل مع اسم مخزّن في متغير. تعرض slotNames() فتحات فئة أو كائن:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
for (s in slotNames(ada)) cat(s, "=", format(slot(ada, s)), "\n")
slot(ada, "age") <- 37
print(ada@age)الناتج:
name = Ada
age = 36
[1] 37يتم التحقق من كل تعيين مقابل النوع المُعلن، وليس new() فقط. يتم رفض القيمة الخاطئة ويحتفظ الكائن بقيمته القديمة:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
ada@age <- "old"الناتج:
Error in (function (cl, name, valueClass) :
assignment of an object of class “character” is not valid for @‘age’ in an object of class “Person”; is(value, "numeric") is not TRUE
Execution haltedتُرجع getSlots() اسم كل خانة مع نوعها المُعلن، مما يتيح للكود تحويل إدخال النص إلى النوع الذي تتوقعه الخانة:
setClass("Person", slots = c(name = "character", age = "numeric"))
types <- getSlots("Person")
print(types)
value <- "40"
if (types[["age"]] == "numeric") value <- as.numeric(value)
print(value + 1)الناتج:
name age
"character" "numeric"
[1] 41التحدي
سهليحتوي الصنف Profile في Profile.R على الفتحات name وcity (character) وage (numeric). أكمل دالتين:
- تتوقف الدالة
update_profile(p, field, value)معno field email(باستخدامcall. = FALSE) عندما لا يكون الحقل فتحة؛ وإلا فإنها تحوّل النصvalueباستخدامas.numeric()عندما تكون الفتحة رقمية، وتضبط الفتحة باستخدامslot()، ثم تُرجع الملف الشخصي المُعدَّل. - تُرجع الدالة
profile_lines(p)سطرًا واحدًا لكل فتحة، بترتيب الفتحات:name: Ada.
يقرأ الكود المُقدَّم اسمًا، ثم أسطرًا مثل city=Paris أو age=36، ويطبّق كلًّا منها، ثم يطبع أسطر الملف الشخصي.
ضع الكود الخاص بك في Profile.R. يحتوي main.R على كود الإدخال/الإخراج المُقدَّم ولا يمكن تعديله.
جرّب بنفسك
source("Profile.R")
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
p <- new("Profile", name = input[1], city = "unknown", age = 0)
for (line in input[-1]) {
kv <- strsplit(line, "=")[[1]]
p <- tryCatch(update_profile(p, kv[1], kv[2]), error = function(e) {
cat("error: ", conditionMessage(e), "\n", sep = "")
p
})
}
for (l in profile_lines(p)) cat(l, "\n", sep = "")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات S3
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكالتدرّب بنفسك: مترجم R عبر الإنترنت