Procs
كائنات Blocks قابلة لإعادة الاستخدام
Procs درس مجاني في Ruby Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Ruby Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Ruby Academy 4 دروس في المجموع.
كائنات الكتل القابلة لإعادة الاستخدام
الكتلة ليست كائنًا بحد ذاتها، لذلك لا يمكنكم تخزينها في متغيّر. يغلّف Proc الكتلة في كائن حقيقي يمكنكم حفظه وتمريره واستدعاؤه لاحقًا.
greeter = Proc.new { puts "Hello!" }
greeter.call
greeter.callإنشاء كائنات Proc
هناك طريقتان شائعتان لإنشاء كائن Proc: Proc.new { ... } وطريقة Kernel الأقصر proc { ... }. وينتج عن كلتيهما النوع نفسه من الكائنات.
double = proc { |x| x * 2 }
p double.call(5)استدعاء Proc
يمكنكم استدعاء Proc بعدة طرق: .call و.() والاختصار باستخدام الأقواس المربعة [ ]. وهذه الطرق متكافئة.
square = proc { |x| x * x }
puts square.call(4)
puts square.(4)
puts square[4]تقبل Procs الوسائط
تقبل Procs المعاملات مثل الكتل تمامًا، وتُعرَّف هذه المعاملات بين الخطّين العموديين.
add = proc { |a, b| a + b }
puts add.call(3, 7)تخزين Procs في المصفوفات
بما أن Procs كائنات، يمكنكم الاحتفاظ بمجموعة من السلوكيات وتشغيلها بالتتابع.
ops = [proc { |x| x + 1 }, proc { |x| x * 2 }]
result = 5
ops.each { |op| result = op.call(result) }
puts resultتمرير Proc ككتلة
ضعوا & قبل Proc لتمريره إلى طريقة تتوقّع كتلة. وتعيده Ruby إلى صيغة الكتلة.
printer = proc { |n| puts "Item: #{n}" }
[1, 2, 3].each(&printer)التقاط الكتل في Procs
يعمل العكس أيضًا: يلتقط &block في توقيع الطريقة الكتلة المُمرَّرة في Proc يمكنكم تخزينه.
def make_handler(&block)
block
end
h = make_handler { |msg| puts "Got: #{msg}" }
h.call("ping")تتسامح Procs مع عدد الوسائط
من السمات الأساسية أن Procs لا تعترض على أعداد الوسائط الخاطئة. إذ تصبح الوسائط المفقودة nil، ويتم تجاهل الوسائط الزائدة.
p1 = proc { |a, b| puts "a=#{a.inspect} b=#{b.inspect}" }
p1.call(1)
p1.call(1, 2, 3)Procs وreturn
تُخرج عبارة return داخل Proc التنفيذ من الطريقة المحيطة، وليس من Proc وحده. وقد يفاجئكم ذلك، لذا توخّوا الحذر.
def demo
p = proc { return 10 }
p.call
20 # never reached
end
puts demoتلتقط Procs السياق المحيط بها
يتذكّر Proc المتغيّرات الموجودة في النطاق الذي عُرّف فيه. وهذا يجعله إغلاقًا، وهو موضوع سنتناوله بمزيد من التفصيل لاحقًا.
factor = 3
times_factor = proc { |n| n * factor }
puts times_factor.call(10)جمع المفاهيم
تحوّل Procs الكتل إلى كائنات من الدرجة الأولى:
- أنشئوها باستخدام
proc { }أوProc.new. - شغّلوها باستخدام
.callأو.()أو[ ]. - مرّروها إلى الطرائق باستخدام
&. - تتسامح مع اختلاف عدد الوسائط، وتستخدم
returnعلى مستوى الطريقة.
pipeline = [proc { |s| s.upcase }, proc { |s| s + "!" }]
text = "hello"
pipeline.each { |step| text = step.call(text) }
puts textاختبار سريع
اختبروا فهمكم لـ Procs.
مراجعة
تعلّمتم Procs:
- Proc هو كتلة مغلّفة في كائن.
- أنشئوه باستخدام
procأوProc.new، وشغّلوه باستخدام.call. - مرّروه إلى الطرائق باستخدام
&. - يتحمّل عدم تطابق عدد الوسائط، ويستخدم
returnعلى مستوى الطريقة.
shout = proc { |word| puts word.upcase }
shout.call("ruby")الأسئلة الشائعة
هل درس «Procs» مجاني؟
نعم — نص درس «Procs» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Ruby Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Ruby Academy 4 دروس في المجموع.
ماذا ستتعلم في «Procs»؟
كائنات Blocks قابلة لإعادة الاستخدام تتمرن على Ruby Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Ruby Academy؟
لا تُشترط خبرة سابقة. Ruby Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «Procs»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Ruby Academy هذا؟
نعم. كل درس في Ruby Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.