الصنف Continuation في روبي

من موسوعة حسوب
مراجعة 21:19، 10 نوفمبر 2018 بواسطة جميل-بيلوني (نقاش | مساهمات) (مراجعة وتدقيق)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

تُولّد الكائنات Continuation بواسطة التابع Kernel.callcc بعد استيراد continuation عبر require. تحمل هذه الكائنات عنوان العودة (return address) وسياق التنفيذ (execution context)، مما يتيح العودة إلى نهاية الكتلة callcc من أي مكان في البرنامج.

كائنات الصنف Continuation مشابهة لحد ما البنية setjmp/longjmp في لغة C (على الرغم من أنَّها تحتوي على حالات أكثر، لذلك يمكن اعتبارها أقرب إلى المهام الفرعية [threads]).

على سبيل المثال:

require "continuation"
arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ]
callcc{|cc| $cc = cc}
puts(message = arr.shift)
$cc.call unless message =~ /Max/

ستُنتِج هذه الشيفرة عند تنفيذها:

Freddie
Herbie
Ron
Max

ويمكن أيضًا استدعاء callcc في توابع أخرى مثل:

require "continuation"

def g
  arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ]
  cc = callcc { |cc| cc }
  puts arr.shift
  return cc, arr.size
end

def f
  c, size = g
  c.call(c) if size > 1
end

f

يسمح هذا المثال للحلقة الداخلية بالخروج مبكرًا:

require "continuation"
callcc {|cont|
  for i in 0..4
    print "\n#{i}: "
    for j in i*5...(i+1)*5
      cont.call() if j == 17
      printf "%3d", j
    end
  end
}
puts

سينتج المثال السابق عند تنفيذ ما يلي:

0:   0  1  2  3  4
1:   5  6  7  8  9
2:  10 11 12 13 14
3:  15 16

توابع الصنف العامة (Public Class Methods)

cont

يستدعي العملية continuation. يستمر البرنامج من نهاية كتلة callcc.

call

يستدعي العملية continuation. يستمر البرنامج من نهاية كتلة callcc.  

مصادر