الصنف Continuation
في روبي
< Ruby
تُولّد الكائنات 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
.