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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مراجعة Blocks
- Procs
- Lambdas
- Closures والنطاق