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

الإغلاقات ذات الحالة

جزء من قسم المنطق وتدفق التنفيذ في رحلة R على Coddy. الدرس 30 من 64.

داخل دالة، ينشئ <- متغيرًا محليًا. يعيّن العامل <<- القيمة إلى المتغير ذي الاسم نفسه في الدالة المحيطة بدلًا من ذلك، لذا يمكن للإغلاق تحديث قيمة التقطها:

make_counter <- function() {
  count <- 0
  function() {
    count <<- count + 1
    count
  }
}
next_id <- make_counter()
print(next_id())
print(next_id())
print(next_id())

الناتج:

[1] 1
[1] 2
[1] 3

لكل عدّاد ينشئه المُنشئ قيمة count الخاصة به، لذا لا يتداخلان مطلقًا:

make_counter <- function() {
  count <- 0
  function() {
    count <<- count + 1
    count
  }
}
a <- make_counter()
b <- make_counter()
for (i in 1:2) a()
print(a())
print(b())

الناتج:

[1] 3
[1] 1

باستخدام <- عادي داخل الإغلاق، ينشئ التحديث متغيرًا محليًا جديدًا يختفي بعد كل استدعاء، ولا تتغير القيمة المخزنة أبدًا:

make_broken <- function() {
  count <- 0
  function() {
    count <- count + 1
    count
  }
}
f <- make_broken()
for (i in 1:2) f()
print(f())

الناتج:

[1] 1

يمكن لمنشئ أن يُعيد قائمة من الإغلاقات التي تشترك في المتغيرات نفسها. وهي تتصرف معًا ككائن صغير له بياناته الخاصة:

make_wallet <- function(balance) {
  list(
    add = function(x) balance <<- balance + x,
    get = function() balance
  )
}
w <- make_wallet(10)
w$add(5)
print(w$get())

الناتج:

[1] 15
challenge icon

التحدي

سهل

أكمل make_counter(). فهي تُعيد دالةً تضيف، في كل مرة يتم استدعاؤها، 1 إلى عدّادها الخاص وتُعيد العدّاد الجديد، بدءًا من 1.

ينشئ الكود المُزوَّد عدّادين، a وb. ويقرأ قائمة مفصولة بفواصل من a وb، ويستدعي العدّاد المطابق لكل إدخال، ويطبع كل قيمة مُعادة في سطر خاص بها.

جرّب بنفسك

make_counter <- function() {
  # اكتب الكود الخاص بك هنا
  function() 0
}

# كود الإدخال/الإخراج المُزوَّد: أبقه كما هو
input <- suppressWarnings(readLines(file("stdin")))
counters <- list(a = make_counter(), b = make_counter())
for (k in strsplit(input[1], ",")[[1]]) cat(counters[[k]](), "\n", sep = "")
quiz iconاختبر نفسك

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

جميع دروس المنطق وتدفق التنفيذ

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