Menu
CoddyTech

تعريف الأصناف المرجعية

جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 37 من 57.

الفئات المرجعية (RC) هي نظام R للكائنات التي تتغير في مكانها، كما في Java أو Python. يعرّف setRefClass() فئةً ذات حقول محددة الأنواع ويُرجع مولّدًا؛ ينشئ $new() كائنًا، ويقرأ $ حقوله ويغيّرها:

Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
a$balance <- a$balance + 50
cat(a$owner, a$balance)

المخرجات:

Ada 150

كائن RC هو مرجع، مثل البيئة. إن إسناده إلى متغير آخر أو تمريره إلى دالة لا ينسخه، لذا فإن التغيير عبر أي اسم هو تغيير في الكائن نفسه:

Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
pay_fee <- function(acc) acc$balance <- acc$balance - 5
a <- Account$new(owner = "Ada", balance = 100)
b <- a
b$balance <- 60
pay_fee(a)
cat(a$balance, b$balance)

الناتج:

55 55

تكون للحقول أنواع محددة. يُرفض إسناد قيمة من فئة غير صحيحة، ويحتفظ الحقل بقيمته القديمة:

Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
msg <- tryCatch({ a$balance <- "lots"; "changed" }, error = function(e) conditionMessage(e))
cat(msg, "\n")
cat(a$balance, "\n")

الناتج:

invalid assignment for reference class field ‘balance’, should be from class “numeric” or a subclass (was class “character”) 
100 

يصف المُنشئ الصنف: تسرد Account$fields() الحقول وأنواعها. يسرد الكائن المطبوع من دون طريقة show حقوله؛ ويكون الحقل الذي لم تُحدَّد له قيمة فارغًا:

Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
print(Account$fields())
Account$new(owner = "Bo")

الناتج:

      owner     balance 
"character"   "numeric" 
Reference class object of class "Account"
Field "owner":
[1] "Bo"
Field "balance":
numeric(0)
challenge icon

التحدي

سهل

صرّح بالفئة المرجعية Book في Book.R مع الحقلين title وauthor (من النوع character) والحقل pages (من النوع numeric)، وأبقِ المُنشئ في Book. ثم اكتب add_pages(book, n)، التي تضيف n إلى عدد صفحات الكتاب مباشرةً، ولا تُرجع شيئًا ذا فائدة.

تقرأ الشيفرة المُقدَّمة title;author;pages، وتنشئ الكتاب، وتُسنِده إلى متغيّر ثانٍ، ثم تضيف الأعداد المتبقية باستخدام ذلك الاسم الثاني، وتطبع الكتاب الأصلي وأسماء الحقول.

ضع شيفرتك في Book.R. يحتوي main.R على شيفرة الإدخال والإخراج المُقدَّمة، ولا يمكن تعديلها.

جرّب بنفسك

source("Book.R")

# رمز الإدخال/الإخراج المقدَّم: أبقه كما هو
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ";")[[1]]
b <- Book$new(title = p[1], author = p[2], pages = as.numeric(p[3]))
alias <- b
for (n in as.numeric(input[-1])) add_pages(alias, n)
cat(b$title, " by ", b$author, ": ", b$pages, " pages\n", sep = "")
cat("fields: ", paste(names(Book$fields()), collapse = ", "), "\n", sep = "")
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم R عبر الإنترنت