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

من موسوعة حسوب
< Ruby‏ | IO
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>pipe‎</code> الخاص بالصنف <code>IO</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: Ru...'
 
لا ملخص تعديل
سطر 3: سطر 3:
[[تصنيف: Ruby Method]]
[[تصنيف: Ruby Method]]
[[تصنيف: Ruby IO]]
[[تصنيف: Ruby IO]]
ينشئ التابع <code>pipe</code> زوجًا من مداخل الأنابيب (pipe endpoints) (متصلة ببعضها البعض) ثم يعيدها على هيئة [[Ruby/Array|مصفوفة]] ثنائية من [[Ruby/IO|مجريات د/خ]] <code>IO</code>:‏ <code>[</code> <code>read_io</code> و <code>write_io</code> <code>]</code>.
ينشئ التابع <code>pipe</code> زوجًا من أطراف الأنابيب (pipe endpoints) (متصلة ببعضها البعض) ثم يعيدها على هيئة [[Ruby/Array|مصفوفة]] ثنائية من [[Ruby/IO|مجريات د/خ]]:‏ <code>[ ''read_io'', ''write_io'' ].</code>


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


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


إذا تم تحديد ترميز معين (اسم ترميز أو كائن ترميز) كوسيط اختياري، سيتم وسم [[Ruby/String|السلسلة النصية]] المقروءة من الأنبوب () بذلك الترميز المحدد. إن كان الوسيط على هيئة علامتي ترميز مفصولتين بنقطتين رأسيتين ("A: B")، فستُحوّل [[Ruby/String|السلسلة النصية]] المقروءة من الترميز A (الترميز الخارجي) إلى الترميز B (الترميز الداخلي)، ثم ستوسم بعلامة الترميز B. إذا تم تحديد وسيطين اختياريين، فيجب أن يكونا كائنات ترميز، أو أسماء ترميز، حيث أن أولهما يمثل الترميز الخارجي، وثانيهما يمثل الترميز الداخلي. إذا تم تحديد الترميز الخارجي والترميز الداخلي، فسيحدد الوسيط الاختياري opt (انظر فقرة البنية العامة) خيارات التحويل.
إذا تم تحديد ترميز معين (اسم ترميز أو كائن ترميز) كوسيط اختياري، فسيتم وسم [[Ruby/String|السلسلة النصية]] المقروءة من الأنبوب (pipe) بذلك الترميز. وإن كان الوسيط على هيئة علامتي ترميز مفصولتين بنقطتين رأسيتين ("<code>A:B</code>")، فستُحوّل [[Ruby/String|السلسلة النصية]] المقروءة من الترميز <code>A</code> (الترميز الخارجي) إلى الترميز <code>B</code> (الترميز الداخلي)، ثم ستوسم بعلامة <code>B</code>. إذا تم تحديد وسيطين اختياريين، فيجب أن يكونا كائني ترميز، أو أسماء ترميز، بحيث يمثل أولهما الترميز الخارجي، ويمثل ثانيهما الترميز الداخلي. إذا تم تحديد الترميز الخارجي والترميز الداخلي، فسيحدد الوسيط الاختياري <code>opt</code> (انظر فقرة البنية العامة) خيارات التحويل.
 
في المثال التالي، تغلق العمليتان طرفي الأنبوب (ends of the pipe) الذي لا تستخدمانه. هذه ليست مجرد عملية تجميلية. لن ينتج طرف القراءة الخاص بالأنبوب نهاية لحالة الملف إن كان هناك أي كاتب (writer) في الأنبوب لا يزال مفتوحًا. في حالة العملية الأم (parent process)، لن تعود <code>rd.read</code> أبداً إذا لم تقم أولاً بإصدار <code>wr.close</code>.
 
 
 
<code>produces:</code>
 
<syntaxhighlight lang="ruby">Sending message to parent
Parent got: <Hi Dad>‎</syntaxhighlight>
==البنية العامة==
==البنية العامة==
<syntaxhighlight lang="ruby">pipe  →  [read_io, write_io]
<syntaxhighlight lang="ruby">pipe  →  [read_io, write_io]
سطر 27: سطر 18:
==المعاملات==
==المعاملات==
===<code>ext_enc‎</code>===
===<code>ext_enc‎</code>===
===<code>"ext_enc:int_enc"‎</code>===
الترميز الخارجي
 
===<code>opt‎</code>===
===<code>opt‎</code>===
خيارات
خيارات
===<code>int_enc‎</code>===
===<code>int_enc‎</code>===
===<code>...‎</code>===
الترميز الداخلي
 
==القيمة المُعادة==
==القيمة المُعادة==
تعاد [[Ruby/Array|مصفوفة]] ثنائية من [[Ruby/IO|مجريات د/خ]]:‏
==أمثلة==
==أمثلة==
مثال على استخدام التابع <code>pipe‎</code>:
في المثال التالي، تغلق العمليتان طرفي الأنبوب (ends of the pipe) الذي لا تستخدمانه. هذه ليست مجرد عملية تكميلية. لأن طرف القراءة الخاص بالأنبوب لن يُولد شرط نهاية الملف إن كان هناك مجرى كتابة (writer) مفتوح مرتبط بالأنبوب. في حالة العملية الأم (parent process)، لن تعود <code>rd.read</code> أبداً إلا بعد إصدار <code>wr.close</code>.
<syntaxhighlight lang="ruby">rd, wr = IO.pipe
<syntaxhighlight lang="ruby">rd, wr = IO.pipe
if fork
if fork
سطر 46: سطر 41:
   wr.write "Hi Dad"
   wr.write "Hi Dad"
   wr.close
   wr.close
end‎</syntaxhighlight>
end‎</syntaxhighlight>الناتج:<syntaxhighlight lang="ruby">Sending message to parent
Parent got: <Hi Dad>‎</syntaxhighlight>
==انظر أيضا==
==انظر أيضا==
* التابع <code>[[Ruby/IO/open|open]]</code>: عند عدم تمرير كتلة، فسيكون التابع <code>IO.open</code> مرادفاً للتابع <code>[[Ruby/IO/new|::new]]</code>.  أما في حال تمرير الكتلة البرمجية، فسيُمرّر إليها <code>io</code> (انظر فقرة البنية العامة) كوسيط، وسيتم إغلاق [[Ruby/IO|مجرى د/خ]] (<code>[[Ruby/IO|IO]]</code>) تلقائيًا عند إنهاء الكتلة. في هذه الحالة، سيعيد التابع <code>[[Ruby/IO/open|::open]]</code> قيمة الكتلة.
* التابع <code>[[Ruby/IO/popen|popen]]</code>: ينفذ التابع <code>popen</code> التعليمة المعطاة في عملية فرعية (subprocess)؛
* التابع <code>[[Ruby/IO/popen|popen]]</code>: ينفذ التابع <code>popen</code> التعليمة المعطاة (انظر فقرة البنية العامة) على شكل عملية فرعي (subprocess)؛ سيتم توصيل المدخلات والمخرجات القياسية للعملية الفرعية إلى [[Ruby/IO|مجرى د/خ]] (<code>IO</code>) المُعاد.
==مصادر==
==مصادر==
*[http://ruby-doc.org/core-2.5.1/IO.html#method-c-pipe قسم  التابع pipe‎ في الصنف IO‎ في توثيق روبي الرسمي.]
*[http://ruby-doc.org/core-2.5.1/IO.html#method-c-pipe قسم  التابع pipe‎ في الصنف IO‎ في توثيق روبي الرسمي.]

مراجعة 23:07، 12 نوفمبر 2018

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

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

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

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

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

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‎

الترميز الخارجي

opt‎

خيارات

int_enc‎

الترميز الداخلي

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

تعاد مصفوفة ثنائية من مجريات د/خ:‏

أمثلة

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

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

الناتج:

Sending message to parent
Parent got: <Hi Dad>

انظر أيضا

  • التابع popen: ينفذ التابع popen التعليمة المعطاة في عملية فرعية (subprocess)؛

مصادر