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

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


في حال إعطاء كتلة، ستُسدعى تلك الكتلة، وتعاد قيمتها، مع تمرير <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>[[Ruby/IO|IO]]</code> إليها. وسيتم إغلاقهما إن لم يغلقا عند خروج الكتلة. أي أن إغلاق هذين المجريين لن يتسبب في حدوث خطأ.


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


إذا تم تحديد ترميز معين (اسم ترميز أو كائن ترميز) كوسيط اختياري، فسيتم وسم [[Ruby/String|السلسلة النصية]] المقروءة من الأنبوب (pipe) بذلك الترميز. وإن كان الوسيط على هيئة علامتي ترميز مفصولتين بنقطتين رأسيتين ("<code>A:B</code>")، فستُحوّل [[Ruby/String|السلسلة النصية]] المقروءة من الترميز <code>A</code> (الترميز الخارجي) إلى الترميز <code>B</code> (الترميز الداخلي)، ثم ستوسم بعلامة <code>B</code>. إذا تم تحديد وسيطين اختياريين، فيجب أن يكونا كائني ترميز، أو أسماء ترميز، بحيث يمثل أولهما الترميز الخارجي، ويمثل ثانيهما الترميز الداخلي. إذا تم تحديد الترميز الخارجي والترميز الداخلي، فسيحدد الوسيط الاختياري <code>opt</code> (انظر فقرة البنية العامة) خيارات التحويل.
إذا تم تمرير ترميز معين (اسم ترميز أو [[Ruby/Encoding|كائن ترميز]]) كمعامل إلى التابع، فسيتم وسم [[Ruby/String|السلسلة النصية]] المقروءة من الأنبوب (pipe) بذلك الترميز. وإن كان المعامل على هيئة علامتي ترميز مفصولتين بنقطتين رأسيتين (مثل "<code>A:B</code>")، فستُحوّل [[Ruby/String|السلسلة النصية]] المقروءة من الترميز <code>A</code> (الترميز الخارجي) إلى الترميز <code>B</code> (الترميز الداخلي)، ثم ستوسم باسم الترميز <code>B</code>. إذا تم تمرير كائنين إلى التابع <code>pipe</code>، فيجب أن يكونا [[Ruby/Encoding|كائني ترميز]]، أو أسماء ترميز، بحيث يمثل أولهما الترميز الخارجي، وثانيهما الترميز الداخلي. إذا تم تحديد الترميز الخارجي والترميز الداخلي، فسيحدد المعامل <code>opt</code> (انظر فقرة البنية العامة) خيارات التحويل.
==البنية العامة==
==البنية العامة==
<syntaxhighlight lang="ruby">pipe  →  [read_io, write_io]
<syntaxhighlight lang="ruby">pipe  →  [read_io, write_io]
سطر 18: سطر 18:
==المعاملات==
==المعاملات==
===<code>ext_enc‎</code>===
===<code>ext_enc‎</code>===
الترميز الخارجي
الترميز الخارجي.
 
===<code>opt‎</code>===
خيارات
===<code>int_enc‎</code>===
===<code>int_enc‎</code>===
الترميز الداخلي
الترميز الداخلي


==القيمة المُعادة==
===<code>opt‎</code>===
تعاد [[Ruby/Array|مصفوفة]] ثنائية من [[Ruby/IO|مجريات د/خ]]:
خيارات التحويل بين الترميزين الداخلي والخارجي إن أعطيا.
==القيمة المعادة==
تعاد [[Ruby/Array|مصفوفة]] بعنصرين بالشكل ‏ <code>[ ''read_io'', ''write_io'' ]</code> تحوي الأنبوبين (الكائنين <code>[[Ruby/IO|IO]]</code>) الذين جرى إنشاؤهما.


==أمثلة==
==أمثلة==
في المثال التالي، تغلق العمليتان طرفي الأنبوب (ends of the pipe) الذي لا تستخدمانه. هذه ليست مجرد عملية تكميلية. لأن طرف القراءة الخاص بالأنبوب لن يُولد شرط نهاية الملف إن كان هناك مجرى كتابة (writer) مفتوح مرتبط بالأنبوب. في حالة العملية الأم (parent process)، لن تعود <code>rd.read</code> أبداً إلا بعد إصدار <code>wr.close</code>.
في المثال التالي، تغلق العمليتان طرفي الأنبوب (ends of the pipe) الذي لا تستخدمانه. هذه ليست مجرد عملية تكميلية لأن طرف القراءة الخاص بالأنبوب لن يُولّد شرط نهاية الملف إن كان هناك مجرى كتابة مفتوح مرتبط بالأنبوب. في حالة العملية الأب (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
سطر 41: سطر 40:
   wr.write "Hi Dad"
   wr.write "Hi Dad"
   wr.close
   wr.close
end‎</syntaxhighlight>الناتج:<syntaxhighlight lang="ruby">Sending message to parent
end‎</syntaxhighlight>ناتج تنفيذ هذا المثال هو:<syntaxhighlight lang="text">Sending message to parent
Parent got: <Hi Dad>‎</syntaxhighlight>
Parent got: <Hi Dad>‎</syntaxhighlight>
==انظر أيضا==
==انظر أيضًا==
* التابع <code>[[Ruby/IO/popen|popen]]</code>: ينفذ التابع <code>popen</code> التعليمة المعطاة في عملية فرعية (subprocess)؛
* التابع [[Ruby/IO/new|<code>new</code>]]: ينشئ كائنًا جديدًا من النوع <code>IO</code>.
* التابع [[Ruby/IO/open|<code>open</code>]]: يشبه التابعَ <code>[[Ruby/IO/new|new]]</code> تمامًا عند استدعائه دون كتلة، أو يُمرّر الكائن <code>IO</code> الذي جرى إنشاؤه كوسيط إلى الكتلة المعطاة ثم يعيد الناتج الذي تعيده الكتلة.
 
* التابع <code>[[Ruby/IO/popen|popen]]</code>: ينفذ التعليمة المعطاة في عملية فرعية (subprocess).
==مصادر==
==مصادر==
*[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‎ في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 14:02، 19 ديسمبر 2018

ينشئ التابع pipe زوجًا من طرفي أنبوب (pipe endpoints) متصلين ببعضهما بعضًا ثم يعيدهما على هيئة مصفوفة من الكائنات IO.

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

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

إذا تم تمرير ترميز معين (اسم ترميز أو كائن ترميز) كمعامل إلى التابع، فسيتم وسم السلسلة النصية المقروءة من الأنبوب (pipe) بذلك الترميز. وإن كان المعامل على هيئة علامتي ترميز مفصولتين بنقطتين رأسيتين (مثل "A:B")، فستُحوّل السلسلة النصية المقروءة من الترميز A (الترميز الخارجي) إلى الترميز B (الترميز الداخلي)، ثم ستوسم باسم الترميز B. إذا تم تمرير كائنين إلى التابع pipe، فيجب أن يكونا كائني ترميز، أو أسماء ترميز، بحيث يمثل أولهما الترميز الخارجي، وثانيهما الترميز الداخلي. إذا تم تحديد الترميز الخارجي والترميز الداخلي، فسيحدد المعامل 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‎

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

int_enc‎

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

opt‎

خيارات التحويل بين الترميزين الداخلي والخارجي إن أعطيا.

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

تعاد مصفوفة بعنصرين بالشكل ‏ read_iowrite_io ] تحوي الأنبوبين (الكائنين IO) الذين جرى إنشاؤهما.‏

أمثلة

في المثال التالي، تغلق العمليتان طرفي الأنبوب (ends of the pipe) الذي لا تستخدمانه. هذه ليست مجرد عملية تكميلية لأن طرف القراءة الخاص بالأنبوب لن يُولّد شرط نهاية الملف إن كان هناك مجرى كتابة مفتوح مرتبط بالأنبوب. في حالة العملية الأب (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>‎

انظر أيضًا

  • التابع new: ينشئ كائنًا جديدًا من النوع IO.
  • التابع open: يشبه التابعَ new تمامًا عند استدعائه دون كتلة، أو يُمرّر الكائن IO الذي جرى إنشاؤه كوسيط إلى الكتلة المعطاة ثم يعيد الناتج الذي تعيده الكتلة.
  • التابع popen: ينفذ التعليمة المعطاة في عملية فرعية (subprocess).

مصادر