الفرق بين المراجعتين لصفحة: «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>maxlen</code> (انظر فقرة البنية العامة) بايتًا على الأكثر .


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


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


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


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


عندما لا يقوم التابع <code>readpartial</code> بالتعطيل، فسيقوم بالعودة، أو يطلق استثناء على الفور. إذا لم يكن المخزن المؤقت للبايت فارغًا، فسيُعيد البيانات الموجودة في المخزن المؤقت. وإلا إن كان في المجرى بعض المحتوى، فسيعيد التابع <code>readpartial</code> البيانات الموجودة في المجرى. خلا ذلك، إذا وصل المجرى إلى محرف نهاية الملف، فسيطلق الاستثناء <code>[[Ruby/EOFError|EOFError]]</code>.
لاحظ أن التابع <code>readpartial</code> يتصرف بشكل مشابه للتابع <code>[[Ruby/IO/sysread|sysread]]</code>. لكن مع الاختلافات التالية:
 
* إذا لم يكن المخزن المؤقت للبايت فارغاً، فسيُقرء من المخزن المؤقت للبايت بدلاً من القراءة من المخزن المؤقت ل[[Ruby/IO|مجرى د/خ]] كما يفعل <code>[[Ruby/IO/sysread|sysread]]</code>.
 
* لا يتسبب في الخطأين <code>Errno::EWOULDBLOCK</code> و <code>Errno::EINTR</code>.  عندما يصادف التابع <code>readpartial</code> الخطأين <code>EWOULDBLOCK</code> و <code>EINTR</code> الناتجين عن  استدعاء النظام <code>read</code>، سيحاول إعادة استدعاء النظام.
 
هذا الأخير يعني أن التابع <code>readpartial</code> غير حساس لقيمة الراية nonblocking. سيقوم بالتعطيل في الحالات التي يقوم فيها التابع <code>[[Ruby/IO/sysread|sysread]]</code> بإطلاق الخطأ <code>Errno::EWOULDBLOCK</code>، كما لو كان <code>fd</code> (واصف الملف) في وضع التعطيل (blocking mode).
لاحظ أن التابع <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: سطر 28:
==المعاملات==
==المعاملات==
===<code>maxlen‎</code>===
===<code>maxlen‎</code>===
الحد الأقصى
عدد صحيح يمثل الحد الأقصى
===<code>outbuf‎</code>===
===<code>outbuf‎</code>===
سلسلة نصية تتلقى البيانات
سلسلة نصية تتلقى البيانات
==القيمة المُعادة==
==القيمة المُعادة==
يعيد التابع <code>readpartial</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"      ""              ""
سطر 57: سطر 51:
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>.
*التابع <code>[[Ruby/IO/readlines-i|readlines]]</code>: يقرأ  كل الأسطر الموجودة في [[Ruby/IO|مجرى د/خ]]، ثم يعيدها في [[Ruby/Array|مصفوفة]].
* التابع <code>[[Ruby/IO/reopen|reopen]]</code>: يربط  بين [[Ruby/IO|مجرى د/خ]] الذي استُدعي معه <code>ios</code> وبين [[Ruby/IO|مجرى د/خ]] المعطى في <code>other_IO</code> (انظر فقرة البنية العامة)، أو مجرى جديد يُفتح من المسار <code>path</code>. قد يؤدي هذا إلى تغيير الصنف الفعلي لهذا المجرى ديناميكيًا.
==مصادر==
==مصادر==
*[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‎ في توثيق روبي الرسمي.]

مراجعة 19:20، 13 نوفمبر 2018

يقرأ التابع readpartial من مجرى د/خ maxlen (انظر فقرة البنية العامة) بايتًا على الأكثر .

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

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

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

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

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

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

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

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

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

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

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

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

المعاملات

maxlen‎

عدد صحيح يمثل الحد الأقصى

outbuf‎

سلسلة نصية تتلقى البيانات

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

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

أمثلة

مثال على استخدام التابع 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"     ""              ""‎

انظر أيضا

مصادر