0Pricing
Ruby Academy · درس

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

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

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