Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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

جزء من قسم البرمجة كائنية التوجه في رحلة 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 (من النوع المحرفي) وpages (من النوع الرقمي)، واحتفظ بالمولّد في 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 عبر الإنترنت