الصنف 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.