0Pricing
Ruby Academy · درس

Closures والنطاق

التقاط المتغيرات

Closures والنطاق درس مجاني في Ruby Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Ruby Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Ruby Academy 4 دروس في المجموع.

التقاط المتغيّرات

الإغلاق هو دالة تتذكّر المتغيّرات الموجودة في المكان الذي عُرّفت فيه، حتى بعد انتهاء تنفيذ ذلك المكان. وتُعد Procs وlambdas إغلاقات.

name = "Ada"
greeter = -> { puts "Hello, #{name}" }
greeter.call

يرافقها المتغيّر

لا ينسخ الإغلاق القيمة، بل يحتفظ بمرجع حي إلى المتغيّر. فإذا غيّرتم المتغيّر لاحقًا، رأى الإغلاق القيمة الجديدة.

count = 0
reader = -> { count }
count = 5
puts reader.call

يمكن للإغلاقات تعديل المتغيّرات

بما أن المرجع حي، يمكن للإغلاق أيضًا تعديل المتغيّر الذي التقطه.

total = 0
adder = ->(n) { total += n }
adder.call(3)
adder.call(7)
puts total

البقاء بعد انتهاء الطريقة المحيطة

يستمر المتغيّر الملتقط في الوجود ما دام الإغلاق موجودًا، حتى بعد أن تعيد الطريقة التي أنشأته قيمتها.

def counter
  n = 0
  -> { n += 1 }
end
c = counter
puts c.call
puts c.call
puts c.call

حالات مستقلة

ينشئ كل استدعاء لطريقة المصنع متغيّرًا جديدًا، ولذلك تحتفظ الإغلاقات المنفصلة بحالات منفصلة.

def counter
  n = 0
  -> { n += 1 }
end
a = counter
b = counter
puts a.call
puts a.call
puts b.call

معاملات الكتلة محلية

تكون المعاملات المعرّفة بين الخطّين العموديين محلية للكتلة، ولا تتسرّب إلى خارجها، حتى عند وجود متغيّر يحمل الاسم نفسه.

x = 100
[1, 2, 3].each { |x| }
puts x  # still 100

متغيّرات محلية للكتلة

أدرجوا أسماء إضافية بعد فاصلة منقوطة بين الخطّين العموديين لإجبارها على أن تكون محلية للكتلة، وحماية المتغيّرات الخارجية من التغيير غير المقصود.

y = "outer"
[1].each { |i; y| y = "inner" }
puts y  # unchanged

بناء دوال قابلة للتهيئة

تتيح لكم الإغلاقات تضمين الإعدادات في دالة مرة واحدة وإعادة استخدامها مرات عديدة.

def power_of(exp)
  ->(base) { base ** exp }
end
square = power_of(2)
cube = power_of(3)
puts square.call(5)
puts cube.call(2)

الإغلاقات أثناء التكرار

من الأخطاء الشائعة أن الإغلاق المُنشأ داخل حلقة يلتقط المتغيّر لا نسخة منه. أما بناء إغلاقات في كل تكرار فيلتقط كل قيمة على حدة.

funcs = [1, 2, 3].map { |i| -> { i } }
puts funcs.map(&:call).inspect

تغليف الحالة الخاصة

يمكن للإغلاقات إخفاء الحالة خلف الدوال، وهو شكل مبكر من الكائنات. وفي هذا المثال، لا يمكن الوصول إلى الرصيد إلا عبر lambdas المُعادة.

def make_account(start)
  balance = start
  deposit = ->(n) { balance += n }
  show = -> { balance }
  [deposit, show]
end
dep, show = make_account(100)
dep.call(50)
puts show.call

جمع المفاهيم

تربط الإغلاقات بين الشيفرة ومكان إنشائها:

  • تلتقط مراجع حيّة إلى المتغيّرات المحيطة.
  • تبقى الحالة موجودة بعد انتهاء الطريقة المحيطة.
  • يحتفظ كل إغلاق بمتغيّرات مستقلة خاصة به.
def tagger(prefix)
  ->(text) { "[#{prefix}] #{text}" }
end
warn = tagger("WARN")
puts warn.call("low disk space")

اختبار سريع

اختبروا فهمكم للإغلاقات.

مراجعة

تعلّمتم الإغلاقات والنطاق:

  • تلتقط Procs وlambdas المتغيّرات المحيطة بالمرجع.
  • تستمر الحالة الملتقطة بعد انتهاء الطريقة المحيطة.
  • يحتفظ كل إغلاق بحالة مستقلة.
  • تبقى معاملات الكتلة محلية؛ استخدموا ; للمتغيّرات المحلية للكتلة.
def stepper(by)
  pos = 0
  -> { pos += by }
end
s = stepper(5)
puts s.call
puts s.call

الأسئلة الشائعة

هل درس «Closures والنطاق» مجاني؟

نعم — نص درس «Closures والنطاق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Ruby Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Ruby Academy 4 دروس في المجموع.

ماذا ستتعلم في «Closures والنطاق»؟

التقاط المتغيرات تتمرن على Ruby Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Ruby Academy؟

لا تُشترط خبرة سابقة. Ruby Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «Closures والنطاق»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Ruby Academy هذا؟

نعم. كل درس في Ruby Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مراجعة Blocks
  2. Procs
  3. Lambdas
  4. Closures والنطاق
← العودة إلى Ruby Academy