الفرق بين المراجعتين لصفحة: «Ruby/Continuation»
< Ruby
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) ط مراجعة وتدقيق |
||
(مراجعة متوسطة واحدة بواسطة مستخدم واحد آخر غير معروضة) | |||
سطر 1: | سطر 1: | ||
تُولّد الكائنات | <noinclude>{{DISPLAYTITLE: الصنف <code>Continuation</code> في روبي}}</noinclude> | ||
[[تصنيف: Ruby]] | |||
[[تصنيف: Ruby Class]] | |||
[[تصنيف: Ruby Continuation]] | |||
تُولّد الكائنات <code>Continuation</code> بواسطة التابع <code>Kernel.callcc</code> بعد استيراد <code>continuation</code> عبر <code>require</code>. تحمل هذه الكائنات عنوان العودة (return address) وسياق التنفيذ (execution context)، مما يتيح العودة إلى نهاية الكتلة <code>callcc</code> من أي مكان في البرنامج. | |||
كائنات الصنف<code>Continuation</code> | كائنات الصنف <code>Continuation</code> مشابهة لحد ما البنية <code>setjmp/longjmp</code> في لغة C (على الرغم من أنَّها تحتوي على حالات أكثر، لذلك يمكن اعتبارها أقرب إلى المهام الفرعية [threads]). | ||
على سبيل المثال:<syntaxhighlight lang="ruby"> | على سبيل المثال:<syntaxhighlight lang="ruby"> | ||
سطر 9: | سطر 13: | ||
puts(message = arr.shift) | puts(message = arr.shift) | ||
$cc.call unless message =~ /Max/ | $cc.call unless message =~ /Max/ | ||
</syntaxhighlight> | </syntaxhighlight>ستُنتِج هذه الشيفرة عند تنفيذها:<syntaxhighlight lang="ruby"> | ||
Freddie | Freddie | ||
Herbie | Herbie | ||
Ron | Ron | ||
Max | Max | ||
</syntaxhighlight>ويمكن أيضًا استدعاء <code>callcc</code> في توابع أخرى:<syntaxhighlight lang="ruby"> | </syntaxhighlight>ويمكن أيضًا استدعاء <code>callcc</code> في توابع أخرى مثل:<syntaxhighlight lang="ruby"> | ||
require "continuation" | require "continuation" | ||
سطر 44: | سطر 48: | ||
puts | puts | ||
</syntaxhighlight> | </syntaxhighlight>سينتج المثال السابق عند تنفيذ ما يلي:<syntaxhighlight lang="ruby"> | ||
0: 0 1 2 3 4 | 0: 0 1 2 3 4 | ||
1: 5 6 7 8 9 | 1: 5 6 7 8 9 | ||
سطر 51: | سطر 55: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==توابع الصنف العامة (Public Class Methods)== | ==توابع الصنف العامة (Public Class Methods)== | ||
===[[Ruby/Continuation/cont| | ===[[Ruby/Continuation/cont|<code>cont</code>]]=== | ||
يستدعي العملية <code>continuation</code>. يستمر البرنامج من نهاية كتلة <code>callcc</code>. | |||
===[[Ruby/Continuation/call| | ===[[Ruby/Continuation/call|<code>call</code>]]=== | ||
يستدعي العملية <code>continuation</code>. يستمر البرنامج من نهاية كتلة <code>callcc</code>. | |||
==مصادر<span> </span>== | ==مصادر<span> </span>== | ||
*[http://ruby-doc.org/core-2.5.1/Continuation.html | *[http://ruby-doc.org/core-2.5.1/Continuation.html صفحة الصنف 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
.