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

أساليب الطباعة والتنسيق

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

عند طباعة قيمة، يستدعي R الدالة print(). من دون أي شيء خاص بالفئة، تتم طباعة كائن S3 كقائمة متبوعة بسمة الفئة، مما يصعّب قراءته:

m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)

الناتج:

$amount
[1] 9.5

$currency
[1] "EUR"

attr(,"class")
[1] "money"

إن الطريقة هي دالة اسمها generic.class. عندما تحصل print() على كائن من الفئة money، تبحث عن print.money() وتستدعيها بدلًا من ذلك. تكتب طريقة الطباعة باستخدام cat() وتنتهي بـ invisible(x)، ولذلك تُرجع الكائن من دون طباعته مرة ثانية:

print.money <- function(x, ...) {
  cat("<money ", x$amount, " ", x$currency, ">\n", sep = "")
  invisible(x)
}
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)
m

الناتج:

<money 9.5 EUR>
<money 9.5 EUR>

format() هو العام لتحويل قيمة إلى نص. تعيد طريقة format.money() النص بدلًا من طباعته، حتى تتمكن التعليمات البرمجية الأخرى من وضعه في جملة، ويمكن لطريقة الطباعة إعادة استخدامه:

format.money <- function(x, ...) {
  sprintf("%.2f %s", x$amount, x$currency)
}
print.money <- function(x, ...) {
  cat("Money:", format(x), "\n")
  invisible(x)
}
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
m
cat("You owe", format(m), "\n")

الناتج:

Money: 9.50 EUR 
You owe 9.50 EUR 

تأخذ الطريقة الوسائط نفسها التي تأخذها دالتها العامة. تُعرَّف print() وformat() على أنها function(x, ...)، لذا تبدأ طرقهما أيضًا بـ x, .... تقبل ... وسائط إضافية مثل digits يمكن للمتصل تمريرها. تعمل الطرق أينما استُدعيت الدالة العامة، على سبيل المثال داخل vapply():

format.money <- function(x, ...) sprintf("%.2f %s", x$amount, x$currency)
wallet <- list(
  structure(list(amount = 3, currency = "EUR"), class = "money"),
  structure(list(amount = 0.5, currency = "USD"), class = "money")
)
print(vapply(wallet, format, character(1)))

الناتج:

[1] "3.00 EUR" "0.50 USD"
challenge icon

التحدي

سهل

الدالة new_money() موجودة في Money.R. أضف طريقتين إلى الملف نفسه:

  • تعيد format.money(x, ...) المبلغ مع منزلتين عشريتين والعملة: 9.50 EUR.
  • تطبع print.money(x, ...) القيمة <money 9.50 EUR> في سطر مستقل، باستخدام format()، وتعيد invisible(x).

يقرأ الكود المُقدَّم الأسطر 9.5 EUR، ويطبع كل كائن نقود، ثم يطبع list: مع جميع المبالغ المنسَّقة، بعد ربطها باستخدام + .

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

جرّب بنفسك

source("Money.R")

# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
all <- list()
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  m <- new_money(as.numeric(p[1]), p[2])
  print(m)
  all[[length(all) + 1]] <- m
}
cat("list: ", paste(vapply(all, format, character(1)), collapse = " + "), "\n", sep = "")
quiz iconاختبر نفسك

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

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

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