الفرق بين المراجعتين لصفحة: «Ruby/Continuation»
< Ruby
لا ملخص تعديل |
لا ملخص تعديل |
||
سطر 1: | سطر 1: | ||
تُولّد الكائنات من الصنف<code>Continuation</code> بواسطة التابع <code>Kernel#callcc</code>، بعد استيراد "<code>continuation</code>". يُعدّ التابع عنوان إعادة (return address) وسياق تنفيذ (execution context)، مما يتيح إعادة غير محلية (nonlocal return) في نهاية الكتلة <code>callcc</code> من أي مكان في البرنامج. | تُولّد الكائنات من الصنف<code>Continuation</code> بواسطة التابع <code>Kernel#callcc</code>، بعد استيراد "<code>continuation</code>". يُعدّ التابع عنوان إعادة (return address) وسياق تنفيذ (execution context)، مما يتيح إعادة غير محلية (nonlocal return) في نهاية الكتلة <code>callcc</code> من أي مكان في البرنامج. | ||
سطر 54: | سطر 51: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==توابع الصنف العامة (Public Class Methods)== | ==توابع الصنف العامة (Public Class Methods)== | ||
===[[Ruby/ | ===[[Ruby/Continuation/cont|التابع <code>cont</code>]]=== | ||
يقوم التابع <code>cont</code> باستدعاء <code>continuation</code>. ويستمر البرنامج من نهاية كتلة <code>callcc</code>. | |||
===[[Ruby/ | ===[[Ruby/Continuation/call|التابع <code>call</code>]]=== | ||
يقوم التابع <code>call</code> باستدعاء <code>continuation</code>. ويستمر البرنامج من نهاية كتلة <code>callcc</code>. | |||
==مصادر | ==مصادر<span> </span>== | ||
<span> </span> | |||
*[http://ruby-doc.org/core-2.5.1/Continuation.html قسم الصنف Continuation في توثيق روبي الرسمي.] | *[http://ruby-doc.org/core-2.5.1/Continuation.html قسم الصنف Continuation في توثيق روبي الرسمي.] |
مراجعة 17:13، 15 سبتمبر 2018
تُولّد الكائنات من الصنفContinuation
بواسطة التابع Kernel#callcc
، بعد استيراد "continuation
". يُعدّ التابع عنوان إعادة (return address) وسياق تنفيذ (execution context)، مما يتيح إعادة غير محلية (nonlocal return) في نهاية الكتلة 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
يقوم التابع cont
باستدعاء continuation
. ويستمر البرنامج من نهاية كتلة callcc
.
التابع call
يقوم التابع call
باستدعاء continuation
. ويستمر البرنامج من نهاية كتلة callcc
.