التابع pipe‎ الخاص بالصنف IO في روبي

من موسوعة حسوب
< Ruby‏ | IO
مراجعة 22:52، 12 نوفمبر 2018 بواسطة محمد-بغات (نقاش | مساهمات) (أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>pipe‎</code> الخاص بالصنف <code>IO</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: Ru...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

ينشئ التابع pipe زوجًا من مداخل الأنابيب (pipe endpoints) (متصلة ببعضها البعض) ثم يعيدها على هيئة مصفوفة ثنائية من مجريات د/خ IO:‏ [ read_io و write_io ].

في حال إعطاء كتلة، ستُسدعى تلك الكتلة، وستعاد قيمتها. تُمرّر read_io و write_io كوسائط إلى الكتلة. في حال عدم إغلاق read_io و write_io عند خروج الكتلة، فسيتم إغلاقها. أي أن إغلاق read_io و/أو write_ لا يتسبب في حدوث خطأ.

التابع pipe غير متوفر في جميع أنظمة التشغيل.

إذا تم تحديد ترميز معين (اسم ترميز أو كائن ترميز) كوسيط اختياري، سيتم وسم السلسلة النصية المقروءة من الأنبوب () بذلك الترميز المحدد. إن كان الوسيط على هيئة علامتي ترميز مفصولتين بنقطتين رأسيتين ("A: B")، فستُحوّل السلسلة النصية المقروءة من الترميز A (الترميز الخارجي) إلى الترميز B (الترميز الداخلي)، ثم ستوسم بعلامة الترميز B. إذا تم تحديد وسيطين اختياريين، فيجب أن يكونا كائنات ترميز، أو أسماء ترميز، حيث أن أولهما يمثل الترميز الخارجي، وثانيهما يمثل الترميز الداخلي. إذا تم تحديد الترميز الخارجي والترميز الداخلي، فسيحدد الوسيط الاختياري opt (انظر فقرة البنية العامة) خيارات التحويل.

في المثال التالي، تغلق العمليتان طرفي الأنبوب (ends of the pipe) الذي لا تستخدمانه. هذه ليست مجرد عملية تجميلية. لن ينتج طرف القراءة الخاص بالأنبوب نهاية لحالة الملف إن كان هناك أي كاتب (writer) في الأنبوب لا يزال مفتوحًا. في حالة العملية الأم (parent process)، لن تعود rd.read أبداً إذا لم تقم أولاً بإصدار wr.close.


produces:

Sending message to parent
Parent got: <Hi Dad>

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

pipe    [read_io, write_io]
pipe(ext_enc)    [read_io, write_io]
pipe("ext_enc:int_enc" [, opt])    [read_io, write_io]
pipe(ext_enc, int_enc [, opt])  [read_io, write_io]
pipe(...) {|read_io, write_io| ... }

المعاملات

ext_enc‎

"ext_enc:int_enc"‎

opt‎

خيارات

int_enc‎

...‎

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

أمثلة

مثال على استخدام التابع pipe‎:

rd, wr = IO.pipe
if fork
  wr.close
  puts "Parent got: <#{rd.read}>"
  rd.close
  Process.wait
else
  rd.close
  puts "Sending message to parent"
  wr.write "Hi Dad"
  wr.close
end

انظر أيضا

  • التابع open: عند عدم تمرير كتلة، فسيكون التابع IO.open مرادفاً للتابع ::new. أما في حال تمرير الكتلة البرمجية، فسيُمرّر إليها io (انظر فقرة البنية العامة) كوسيط، وسيتم إغلاق مجرى د/خ (IO) تلقائيًا عند إنهاء الكتلة. في هذه الحالة، سيعيد التابع ::open قيمة الكتلة.
  • التابع popen: ينفذ التابع popen التعليمة المعطاة (انظر فقرة البنية العامة) على شكل عملية فرعي (subprocess)؛ سيتم توصيل المدخلات والمخرجات القياسية للعملية الفرعية إلى مجرى د/خ (IO) المُعاد.

مصادر