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

الطرق للدوال المضمّنة

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

تضيف setMethod() أيضًا أساليب S4 إلى الدوال الأساسية مثل length() وsummary(). تواصل الدالة الأساسية عملها مع كل شيء آخر، بينما يحصل صنفك على سلوكه الخاص:

setClass("Playlist", slots = c(name = "character", songs = "character"))
setMethod("length", "Playlist", function(x) length(x@songs))
pl <- new("Playlist", name = "gym", songs = c("a", "b", "c"))
print(length(pl))
print(length(c(1, 2)))

المخرجات:

[1] 3
[1] 2

المعاملات هي أيضًا دوال عامة. تُسمّي طريقة + فئتَي كلا الجانبين في signature(). ويُسمّى الوسيطان e1 وe2:

setClass("Money", slots = c(amount = "numeric"))
setMethod("show", "Money", function(object) cat(sprintf("%.2f", object@amount), "\n"))
setMethod("+", signature("Money", "Money"), function(e1, e2) {
  new("Money", amount = e1@amount + e2@amount)
})
new("Money", amount = 2.5) + new("Money", amount = 4)

الناتج:

6.50 

يمثل المعمّم الجماعي Arith العمليات + و- و* و/ و^ وبقية العمليات دفعةً واحدة. وداخل أسلوبه، يكرر callGeneric() أيَّ معامل استُخدم، على القيم التي تمررها:

setClass("Money", slots = c(amount = "numeric"))
setMethod("Arith", signature("Money", "numeric"), function(e1, e2) {
  new("Money", amount = callGeneric(e1@amount, e2))
})
m <- new("Money", amount = 10)
cat((m * 3)@amount, (m / 4)@amount, (m - 1)@amount)

الناتج:

30 2.5 9

تغطي الدالة العامة للمجموعة Compare العمليات == و< و> وغيرها. وتُرجع طريقتها ما تُرجعه callGeneric() للفتحات، أي قيمة منطقية:

setClass("Money", slots = c(amount = "numeric"))
setMethod("Compare", signature("Money", "Money"), function(e1, e2) {
  callGeneric(e1@amount, e2@amount)
})
a <- new("Money", amount = 5)
b <- new("Money", amount = 8)
cat(a < b, a == b, a >= b)

الناتج:

TRUE FALSE FALSE
challenge icon

التحدي

سهل

يحتوي الصنف Money في Money.R على الفتحتين amount (رقمية) وcurrency (محرفية). أضف أربع طرائق:

  • تطبع show() القيمة 12.50 EUR وسطرًا جديدًا؛
  • تعيد + لكائنَي Money مجموعهما، أو تتوقف مع cannot add EUR and USD (باستخدام call. = FALSE) عندما تختلف العملتان؛
  • تعيد * لكائن Money ورقم المبلغَ بعد تحجيمه؛
  • تكون == لكائنَي Money مساويةً لـ TRUE عندما يكون كلٌّ من المبلغ والعملة متساويًا.

يقرأ الكود المتوفر الأسطر 10:EUR + 2.5:EUR أو 4:USD * 3 أو 1:EUR == 1:EUR ويطبع النتيجة أو error: والرسالة.

ضع الكود الخاص بك في Money.R. يحتوي main.R على كود الإدخال/الإخراج المتوفر ولا يمكن تعديله.

جرّب بنفسك

source("Money.R")

# كود الإدخال/الإخراج المُزوَّد: اتركه كما هو
input <- suppressWarnings(readLines(file("stdin")))
parse_money <- function(t) {
  p <- strsplit(t, ":")[[1]]
  new("Money", amount = as.numeric(p[1]), currency = p[2])
}
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  a <- parse_money(p[1])
  tryCatch({
    if (p[2] == "+") print(a + parse_money(p[3]))
    if (p[2] == "*") print(a * as.numeric(p[3]))
    if (p[2] == "==") cat(a == parse_money(p[3]), "\n", sep = "")
  }, error = function(e) cat("error: ", conditionMessage(e), "\n", sep = ""))
}
quiz iconاختبر نفسك

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

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

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