الفرق بين المراجعتين لصفحة: «Ruby/Continuation»

من موسوعة حسوب
لا ملخص تعديل
ط مراجعة وتدقيق
 
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: صفحة الصنف <code>Continuation</code> في روبي}}</noinclude>
<noinclude>{{DISPLAYTITLE: الصنف <code>Continuation</code> في روبي}}</noinclude>
[[تصنيف: Ruby]]
[[تصنيف: Ruby]]
[[تصنيف: Ruby Class]]
[[تصنيف: Ruby Continuation]]
[[تصنيف: Ruby Continuation]]
تُولّد الكائنات من الصنف<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> عبر <code>require</code>. تحمل هذه الكائنات عنوان العودة (return address) وسياق التنفيذ (execution context)، مما يتيح العودة إلى نهاية الكتلة <code>callcc</code> من أي مكان في البرنامج.


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


على سبيل المثال:<syntaxhighlight lang="ruby">
على سبيل المثال:<syntaxhighlight lang="ruby">
سطر 12: سطر 13:
puts(message = arr.shift)
puts(message = arr.shift)
$cc.call unless message =~ /Max/
$cc.call unless message =~ /Max/
</syntaxhighlight>ستنتج:<syntaxhighlight lang="ruby">
</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"


سطر 47: سطر 48:
puts
puts


</syntaxhighlight>ستنتج:<syntaxhighlight lang="ruby">
</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
سطر 54: سطر 55:
</syntaxhighlight>
</syntaxhighlight>
==توابع الصنف العامة (Public Class Methods)==
==توابع الصنف العامة (Public Class Methods)==
===[[Ruby/Continuation/cont|التابع <code>cont</code>]]===
===[[Ruby/Continuation/cont|<code>cont</code>]]===
يقوم التابع <code>cont</code> باستدعاء <code>continuation</code>. ويستمر البرنامج من نهاية كتلة <code>callcc</code>.
يستدعي العملية <code>continuation</code>. يستمر البرنامج من نهاية كتلة <code>callcc</code>.
===[[Ruby/Continuation/call|التابع <code>call</code>]]===
===[[Ruby/Continuation/call|<code>call</code>]]===
يقوم التابع <code>call</code> باستدعاء <code>continuation</code>. ويستمر البرنامج من نهاية كتلة <code>callcc</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 في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 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.  

مصادر