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

من موسوعة حسوب
< Ruby‏ | IO
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>IO.readpartial‎</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: Ruby Method تصنيف: R...'
 
ط تدقيق
 
(مراجعة متوسطة واحدة بواسطة مستخدم واحد آخر غير معروضة)
سطر 3: سطر 3:
[[تصنيف: Ruby Method]]
[[تصنيف: Ruby Method]]
[[تصنيف: Ruby IO]]
[[تصنيف: Ruby IO]]
يقرأ التابع <code>readpartial</code> <code>maxlen</code> (انظر فقرة البنية العامة) بايتًا على الأكثر من [[Ruby/IO|مجرى د/خ]]. لا يقوم التابع <code>readpartial</code> بالتعطيل إلا في حال لم يكن في [[Ruby/IO|مجرى د/خ]] <code>ios</code> أي بيانات متوفرة آنيًا. لن يقوم بالتعطيل في حالة توفر بعض البيانات.
يقرأ التابع <code>readpartial</code> عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استدعي معه.


في حال إعطاء الوسيط الاختياري <code>outbuf</code> (انظر فقرة البنية العامة)، فينبغي أن يشير إلى [[Ruby/String|سلسلة نصية]] <code>[[Ruby/String|String]]</code>، والتي ستتلقى البيانات. لن يحتوي الوسيط <code>outbuf</code> إلا البيانات المستلمة بعد استدعاء التابع، حتى لو لم يكن فارغاً في البداية.
لن يقوم التابع <code>readpartial</code> بالتعطيل (block) إلا في حال لم يكن في [[Ruby/IO|المجرى]] أي بيانات متوفرة آنذاك. أي أنه لن يُعطِّل في حالة توفر بعض البيانات.


يُطلق التابع <code>readpartial</code> الاستثناء <code>EOFError</code> عند نهاية الملف.
يُطلق التابع <code>readpartial</code> الاستثناء <code>[[Ruby/EOFError|EOFError]]</code> عند نهاية الملف.


صُمِّم التابع <code>readpartial</code> لأجل المجاري (streams) من مثل الأنابيب (pipes)، والمقابس (sockets)، والأداة tty، إلخ. ولن يقوم بالتعطيل إلا عند عدم توفر أية بيانات فوريا. هذا يعني أنه سيُعطّل فقط عند تحقق جميع الشروط التالية.
صُمِّم التابع <code>readpartial</code> للتعامل مع نوع محدَّد من المجاري (streams) من مِثل الأنابيب (pipes)، والمقابس (sockets)، والطرفية tty، ...إلخ. ولن يقوم بالتعطيل إلا عند عدم توفر أية بيانات حينذاك. هذا يعني أنه سيُعطّل فقط عند تحقق جميع الشروط التالية:
* ذاكرة التخزين المؤقت للبايت (byte buffer) في الكائن <code>[[Ruby/IO|IO]]</code> فارغة.
* محتوى المجرى فارغ.
* المجرى لم يبلغ محرف نهاية الملف (EOF).
عندما يقوم التابع <code>readpartial</code> بالتعطيل، فإنَّه ينتظر البيانات أو محرف نهاية الملف <code>EOF</code> من المجرى. فإذا حصل التابع <code>readpartial</code> على بيانات، فسيعيدها. أما إذا وصل إلى محرف نهاية الملف، فسيُطلق الاستثناء <code>[[Ruby/EOFError|EOFError]]</code>.


ذاكرة التخزين المؤقت للبايت (byte buffer) في [[Ruby/IO|مجرى د/خ]] <code>[[Ruby/IO|IO]]</code> فارغة.
عندما لا يقوم التابع <code>readpartial</code> بالتعطيل، فسيقوم بالعودة، أو يطلق استثناء مباشرةً. وإذا لم يكن المخزن المؤقت للبايت فارغًا، فسيُعيد البيانات الموجودة فيه. وإلا، إن كان في المجرى بعض المحتويات، فسيعيدها. خلا ذلك، إذا وصل المجرى إلى محرف نهاية الملف، فسيطلق الاستثناء <code>[[Ruby/EOFError|EOFError]]</code>.


محتوى المجرى فارغ.
لاحظ أنَّ التابع <code>readpartial</code> يتصرف بشكل مشابه للتابع <code>[[Ruby/IO/sysread|sysread]]</code>. لكن مع الاختلافات التالية:
 
* إذا لم يكن المخزن المؤقت للبايت فارغًا، فسيُقرَء من المخزن المؤقت للبايت بدلًا من القراءة من المخزن المؤقت الخاص بالكائن [[Ruby/IO|<code>IO</code>]] كما يفعل <code>[[Ruby/IO/sysread|sysread]]</code>.
المجرى لم يبلغ محرف نهاية الملف (EOF).
* لا يتسبب في الخطأين <code>Errno::EWOULDBLOCK</code> و <code>Errno::EINTR</code>.  عندما يصادف التابع <code>readpartial</code> الخطأين <code>EWOULDBLOCK</code> و <code>EINTR</code> الناتجين عن  استدعاء النظام <code>read</code>، سيحاول إعادة استدعاء النظام.
 
الأمر الأخير يعني أنَّ التابع <code>readpartial</code> غير حساس لقيمة راية عدم التعطيل ( nonblocking flag). سيقوم بالتعطيل في الحالات التي يقوم فيها التابع <code>[[Ruby/IO/sysread|sysread]]</code> بإطلاق الخطأ <code>Errno::EWOULDBLOCK</code>، كما لو كان <code>fd</code> (واصف الملف) في وضع التعطيل (blocking mode).
عندما يقوم التابع <code>readpartial</code> بالتعطيل، فإنه ينتظر البيانات أو محرف نهاية الملف EOF من المجرى. إذا حصل التابع <code>readpartial</code> على بيانات، فسيعيد تلك البيانات. أما إذا وصل إلى محرف نهاية الملف، فسيُطلق الاستثناء <code>[[Ruby/EOFError|EOFError]]</code>.
 
عندما لا يقوم التابع <code>readpartial</code> بالتعطيل، فسيقوم بالعودة، أو يطلق استثناء على الفور. إذا لم يكن المخزن المؤقت للبايت فارغًا، فسيُعيد البيانات الموجودة في المخزن المؤقت. وإلا إن كان في المجرى بعض المحتوى، فسيعيد التابع <code>readpartial</code> البيانات الموجودة في المجرى. خلا ذلك، إذا وصل المجرى إلى محرف نهاية الملف، فسيطلق الاستثناء <code>[[Ruby/EOFError|EOFError]]</code>.
 
 
 
لاحظ أن التابع <code>readpartial</code> يتصرف بشكل مشابه للتابع sysread. الاختلافات هي:
 
إذا لم يكن المخزن المؤقت للبايت فارغاً، فسيقرء من المخزن المؤقت للبايت بدلاً من "القراء من المخزن المؤقت ل[[Ruby/IO|مجرى د/خ]] <code>[[Ruby/IO|IO]]</code> (IOError)".
 
لا يتسبب في الخطأين Errno :: EWOULDBLOCK و Errno :: EINTR.  عندما يصادف التابع <code>readpartial</code> EWOULDBLOCK و EINTR من استدعاء النظام read، سيحاول التابع <code>readpartial</code> إعادة استدعاء النظام.
 
هذا الأخير يعني أن التابع <code>readpartial</code> غير حساس لقيمة الراية nonblocking. سيقوم بالتعطيل في الحالات التي يقوم فيها التابع <code>[[Ruby/IO/sysread|#sysread]]</code> بإطلاق الخطأ Errno::EWOULDBLOCK، كما لو كان fd في وضع التعطيل (blocking mode).
==البنية العامة==
==البنية العامة==
<syntaxhighlight lang="ruby">readpartial(maxlen)  → string
<syntaxhighlight lang="ruby">readpartial(maxlen)  → string
سطر 35: سطر 26:
==المعاملات==
==المعاملات==
===<code>maxlen‎</code>===
===<code>maxlen‎</code>===
الحد الأقصى
عدد صحيح يمثِّل الحد الأقصى للبايتات المراد قراءتها من المجرى المعطى.
===<code>outbuf‎</code>===
===<code>outbuf‎</code>===
سلسلة نصية تتلقى البيانات
في حال إعطاء هذا المعامل الاختياري، فينبغي أن يشير إلى [[Ruby/String|السلسلة النصية]] التي ستتلقى البيانات المقروءة من المجرى. لن يحتوي <code>outbuf</code> إلا على البيانات المستلمة بعد استدعاء التابع حتى لو لم يكن فارغًا في البداية (أي ستُمسَح البيانات القديمة المخزنة فيه مسبقًا).
==القيمة المُعادة==
==القيمة المعادة==
تعاد سلسلة نصية تحوي البيانات المقروءة من المجرى.
 
==أمثلة==
==أمثلة==
مثال على استخدام التابع <code>readpartial‎</code>:
مثال على استخدام التابع <code>readpartial‎</code>:<syntaxhighlight lang="ruby">r, w = IO.pipe          #              buffer          pipe content
<syntaxhighlight lang="ruby">r, w = IO.pipe          #              buffer          pipe content
w << "abc"              #              ""              "abc".
w << "abc"              #              ""              "abc".
r.readpartial(4096)      #=> "abc"      ""              ""
r.readpartial(4096)      #=> "abc"      ""              ""
سطر 56: سطر 48:
r.readpartial(4096)      #=> "def\n"    ""              "ghi\n"
r.readpartial(4096)      #=> "def\n"    ""              "ghi\n"
r.readpartial(4096)      #=> "ghi\n"    ""              ""‎</syntaxhighlight>
r.readpartial(4096)      #=> "ghi\n"    ""              ""‎</syntaxhighlight>
==انظر أيضا==
==انظر أيضًا==
* التابع <code>[[Ruby/IO/readlines-i|readlines]]</code>: يقرأ كل الأسطر الموجودة في [[Ruby/IO|مجرى د/خ]] <code>ios</code>، ثم يعيدها في [[Ruby/Array|مصفوفة]]. يتم فصل الأسطر بالوسيط الاختياري <code>sep</code> (انظر فقرة البنية العامة). إن كان الوسيط <code>sep</code> يساوي <code>nil</code>، فسسيُعاد بقية المجرى كتسجيلة (record) واحدة. إن كان الوسيط الأول عددًا صحيحًا، أو إن أعطي الوسيط الاختياري الثاني، فلن تكون [[Ruby/String|السلسلة النصية]] المعادة أطول من حيث عدد البايتات من القيمة المحددة. يجب أن يكون المجرى مفتوحًا في وضعية القراءة أو سيُطلق استثناء <code>IOError</code>.
*التابع [[Ruby/IO/printf|<code>printf</code>]]: ينسق الكائنات المُمرَّرة إليه ثم يكتبها في المجرى الذي استدعي معه. 
* التابع <code>[[Ruby/IO/reopen|reopen]]</code>: يربط  بين [[Ruby/IO|مجرى د/خ]] الذي استُدعي معه <code>ios</code> وبين [[Ruby/IO|مجرى د/خ]] المعطى في <code>other_IO</code> (انظر فقرة البنية العامة)، أو مجرى جديد يُفتح من المسار <code>path</code>. قد يؤدي هذا إلى تغيير الصنف الفعلي لهذا المجرى ديناميكيًا.
 
*التابع [[Ruby/IO/read-i|<code>read</code>]]: يقرأ عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استدعي معه.
*التابع <code>[[Ruby/IO/read nonblock|read_nonblock]]</code>: يقرأ عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استُدعي معه باستخدام استدعاء النظام <code>read(2)</code> بعد تعيين الراية <code>O_NONBLOCK</code> لواصف الملف (file descriptor) الأساسي.
*التابع [[Ruby/IO/readbyte|<code>readbyte</code>]]: يقرأ بايتًا واحدًا من المجرى الذي استدعي معه.
*التابع [[Ruby/IO/readchar|<code>readchar</code>]]: يقرأ محرفًا واحدًا من [[Ruby/IO|المجرى]] الذي استدعي معه.
*التابع [[Ruby/IO/readline|<code>readline</code>]]: يقرأ سطرًا واحدًا من المجرى الذي استدعي معه.
*التابع [[Ruby/IO/readlines-i|<code>readlines</code>]]: يقرأ كل الأسطر الموجودة في [[Ruby/IO|المجرى]] الذي استدعي معه ثم يعيدها في [[Ruby/Array|مصفوفة]]. 
==مصادر==
==مصادر==
*[http://ruby-doc.org/core-2.5.1/IO.html#method-i-readpartial قسم التابع readpartial‎ في الصنف IO‎ في توثيق روبي الرسمي.]
*[http://ruby-doc.org/core-2.5.1/IO.html#method-i-readpartial قسم التابع readpartial‎ في الصنف IO‎ في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 08:54، 23 ديسمبر 2018

يقرأ التابع readpartial عددًا محدَّدًا من البايتات من المجرى الذي استدعي معه.

لن يقوم التابع readpartial بالتعطيل (block) إلا في حال لم يكن في المجرى أي بيانات متوفرة آنذاك. أي أنه لن يُعطِّل في حالة توفر بعض البيانات.

يُطلق التابع readpartial الاستثناء EOFError عند نهاية الملف.

صُمِّم التابع readpartial للتعامل مع نوع محدَّد من المجاري (streams) من مِثل الأنابيب (pipes)، والمقابس (sockets)، والطرفية tty، ...إلخ. ولن يقوم بالتعطيل إلا عند عدم توفر أية بيانات حينذاك. هذا يعني أنه سيُعطّل فقط عند تحقق جميع الشروط التالية:

  • ذاكرة التخزين المؤقت للبايت (byte buffer) في الكائن IO فارغة.
  • محتوى المجرى فارغ.
  • المجرى لم يبلغ محرف نهاية الملف (EOF).

عندما يقوم التابع readpartial بالتعطيل، فإنَّه ينتظر البيانات أو محرف نهاية الملف EOF من المجرى. فإذا حصل التابع readpartial على بيانات، فسيعيدها. أما إذا وصل إلى محرف نهاية الملف، فسيُطلق الاستثناء EOFError.

عندما لا يقوم التابع readpartial بالتعطيل، فسيقوم بالعودة، أو يطلق استثناء مباشرةً. وإذا لم يكن المخزن المؤقت للبايت فارغًا، فسيُعيد البيانات الموجودة فيه. وإلا، إن كان في المجرى بعض المحتويات، فسيعيدها. خلا ذلك، إذا وصل المجرى إلى محرف نهاية الملف، فسيطلق الاستثناء EOFError.

لاحظ أنَّ التابع readpartial يتصرف بشكل مشابه للتابع sysread. لكن مع الاختلافات التالية:

  • إذا لم يكن المخزن المؤقت للبايت فارغًا، فسيُقرَء من المخزن المؤقت للبايت بدلًا من القراءة من المخزن المؤقت الخاص بالكائن IO كما يفعل sysread.
  • لا يتسبب في الخطأين Errno::EWOULDBLOCK و Errno::EINTR. عندما يصادف التابع readpartial الخطأين EWOULDBLOCK و EINTR الناتجين عن استدعاء النظام read، سيحاول إعادة استدعاء النظام.

الأمر الأخير يعني أنَّ التابع readpartial غير حساس لقيمة راية عدم التعطيل ( nonblocking flag). سيقوم بالتعطيل في الحالات التي يقوم فيها التابع sysread بإطلاق الخطأ Errno::EWOULDBLOCK، كما لو كان fd (واصف الملف) في وضع التعطيل (blocking mode).

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

readpartial(maxlen)   string
readpartial(maxlen, outbuf) outbuf

المعاملات

maxlen‎

عدد صحيح يمثِّل الحد الأقصى للبايتات المراد قراءتها من المجرى المعطى.

outbuf‎

في حال إعطاء هذا المعامل الاختياري، فينبغي أن يشير إلى السلسلة النصية التي ستتلقى البيانات المقروءة من المجرى. لن يحتوي outbuf إلا على البيانات المستلمة بعد استدعاء التابع حتى لو لم يكن فارغًا في البداية (أي ستُمسَح البيانات القديمة المخزنة فيه مسبقًا).

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

تعاد سلسلة نصية تحوي البيانات المقروءة من المجرى.

أمثلة

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

r, w = IO.pipe           #               buffer          pipe content
w << "abc"               #               ""              "abc".
r.readpartial(4096)      #=> "abc"       ""              ""
r.readpartial(4096)      # blocks because buffer and pipe is empty.
r, w = IO.pipe           #               buffer          pipe content
w << "abc"               #               ""              "abc"
w.close                  #               ""              "abc" EOF
r.readpartial(4096)      #=> "abc"       ""              EOF
r.readpartial(4096)      # raises EOFError
r, w = IO.pipe           #               buffer          pipe content
w << "abc\ndef\n"        #               ""              "abc\ndef\n"
r.gets                   #=> "abc\n"     "def\n"         ""
w << "ghi\n"             #               "def\n"         "ghi\n"
r.readpartial(4096)      #=> "def\n"     ""              "ghi\n"
r.readpartial(4096)      #=> "ghi\n"     ""              ""‎

انظر أيضًا

  • التابع printf: ينسق الكائنات المُمرَّرة إليه ثم يكتبها في المجرى الذي استدعي معه. 
  • التابع read: يقرأ عددًا محدَّدًا من البايتات من المجرى الذي استدعي معه.
  • التابع read_nonblock: يقرأ عددًا محدَّدًا من البايتات من المجرى الذي استُدعي معه باستخدام استدعاء النظام read(2)‎ بعد تعيين الراية O_NONBLOCK لواصف الملف (file descriptor) الأساسي.
  • التابع readbyte: يقرأ بايتًا واحدًا من المجرى الذي استدعي معه.
  • التابع readchar: يقرأ محرفًا واحدًا من المجرى الذي استدعي معه.
  • التابع readline: يقرأ سطرًا واحدًا من المجرى الذي استدعي معه.
  • التابع readlines: يقرأ كل الأسطر الموجودة في المجرى الذي استدعي معه ثم يعيدها في مصفوفة

مصادر