الفرق بين المراجعتين ل"Ruby/Fiber/transfer"

من موسوعة حسوب
< Ruby‏ | Fiber
اذهب إلى التنقل اذهب إلى البحث
ط (مراجعة وتدقيق.)
ط
 
سطر 25: سطر 25:
 
مثالٌ عن استخدام التّابع <code>transfer</code>:<syntaxhighlight lang="ruby">
 
مثالٌ عن استخدام التّابع <code>transfer</code>:<syntaxhighlight lang="ruby">
 
fiber1 = Fiber.new do
 
fiber1 = Fiber.new do
 
+
  puts "In Fiber 1"
 puts "In Fiber 1"
+
  Fiber.yield
 
 
 Fiber.yield
 
 
 
 
end
 
end
  
 
fiber2 = Fiber.new do
 
fiber2 = Fiber.new do
 
+
  puts "In Fiber 2"
 puts "In Fiber 2"
+
  fiber1.transfer
 
+
  puts "Never see this message"
 fiber1.transfer
 
 
 
 puts "Never see this message"
 
 
 
 
end
 
end
  
 
fiber3 = Fiber.new do
 
fiber3 = Fiber.new do
 
+
  puts "In Fiber 3"
 puts "In Fiber 3"
 
 
 
 
end
 
end
  
 
fiber2.resume
 
fiber2.resume
 
 
fiber3.resume
 
fiber3.resume
 
  
 
</syntaxhighlight>سيعطي هذا المثال عند تنفيذه الناتج:<syntaxhighlight lang="ruby">
 
</syntaxhighlight>سيعطي هذا المثال عند تنفيذه الناتج:<syntaxhighlight lang="ruby">
 
In fiber 2
 
In fiber 2
 
 
In fiber 1
 
In fiber 1
 
 
In fiber 3
 
In fiber 3
  

المراجعة الحالية بتاريخ 19:12، 18 أكتوبر 2018

ينقل التّابع transfer التحكّم إلى ليف (fiber) آخر، أو يستأنف عمل الليف الحالي عند آخر نقطة أوقف فيها، أو يبدأه إذا لم يُستأنَف سابقًا. سيُعلَّق الليف المُستدعَى كما في استدعاء Fiber.yield. يجب عليك طلب 'fiber' قبل استخدام هذا التّابع.

يعامل الليف طلب التحويل ( عبر transfer) الذي يستقبله على أنَّه نداء استئنافٍ. الوسائط المُمرَّرة من أجل التحويل تعامل كتلك المُمرَّرة من أجل الاستئناف.

لا يمكنك استئناف ليفٍ حُوِّل تحكمه إلى ليفٍ آخر. سيسبّب هذا خطأ استئنافٍ مضاعفٍ. عليك إعادة تحويل التحكّم إلى الليف الأول حتى تتمكن من توليده واستئنافه مجدَّدًا.

البنية العامة

transfer(args, ...)  obj

المعاملات

args

الوسائط المراد تمريرها.

الوسائط الأخرى الإضافية المراد تمريرها أيضًا.

القيم المعادة

يعاد كائنُ.

الأمثلة

مثالٌ عن استخدام التّابع transfer:

fiber1 = Fiber.new do
  puts "In Fiber 1"
  Fiber.yield
end

fiber2 = Fiber.new do
  puts "In Fiber 2"
  fiber1.transfer
  puts "Never see this message"
end

fiber3 = Fiber.new do
  puts "In Fiber 3"
end

fiber2.resume
fiber3.resume

سيعطي هذا المثال عند تنفيذه الناتج:

In fiber 2
In fiber 1
In fiber 3

انظر أيضا

  • التابع yield: يتحكم مجدَّدًا بالسياق (contex) الذي استئنَفَ عمل الليف (fiber) مُمرِّرًا أيَّ وسائط قد مُرِّرت إليه.
  • التابع resume: يستأنف الليف (fiber) من النقطة التي استدعُي فيها التّابع Fiber.yield آخر مرّة.

مصادر