الفرق بين المراجعتين لصفحة: «Ruby/IO/readpartial»
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) ط تدقيق |
||
سطر 3: | سطر 3: | ||
[[تصنيف: Ruby Method]] | [[تصنيف: Ruby Method]] | ||
[[تصنيف: Ruby IO]] | [[تصنيف: Ruby IO]] | ||
يقرأ التابع <code>readpartial</code> من [[Ruby/IO| | يقرأ التابع <code>readpartial</code> عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استدعي معه. | ||
لن يقوم التابع <code>readpartial</code> بالتعطيل (block) إلا في حال لم يكن في [[Ruby/IO| | لن يقوم التابع <code>readpartial</code> بالتعطيل (block) إلا في حال لم يكن في [[Ruby/IO|المجرى]] أي بيانات متوفرة آنذاك. أي أنه لن يُعطِّل في حالة توفر بعض البيانات. | ||
يُطلق التابع <code>readpartial</code> الاستثناء <code>[[Ruby/EOFError|EOFError]]</code> عند نهاية الملف. | |||
صُمِّم التابع <code>readpartial</code> للتعامل مع نوع محدَّد من المجاري (streams) من مِثل الأنابيب (pipes)، والمقابس (sockets)، والطرفية tty، ...إلخ. ولن يقوم بالتعطيل إلا عند عدم توفر أية بيانات حينذاك. هذا يعني أنه سيُعطّل فقط عند تحقق جميع الشروط التالية: | |||
* ذاكرة التخزين المؤقت للبايت (byte buffer) في الكائن <code>[[Ruby/IO|IO]]</code> فارغة. | |||
صُمِّم التابع <code>readpartial</code> | |||
* ذاكرة التخزين المؤقت للبايت (byte buffer) في [[Ruby/IO| | |||
* محتوى المجرى فارغ. | * محتوى المجرى فارغ. | ||
* المجرى لم يبلغ محرف نهاية الملف (EOF). | * المجرى لم يبلغ محرف نهاية الملف (EOF). | ||
عندما يقوم التابع <code>readpartial</code> بالتعطيل، | عندما يقوم التابع <code>readpartial</code> بالتعطيل، فإنَّه ينتظر البيانات أو محرف نهاية الملف <code>EOF</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>IO</code>]] كما يفعل <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>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). | |||
==البنية العامة== | ==البنية العامة== | ||
<syntaxhighlight lang="ruby">readpartial(maxlen) → string | <syntaxhighlight lang="ruby">readpartial(maxlen) → string | ||
سطر 28: | سطر 26: | ||
==المعاملات== | ==المعاملات== | ||
===<code>maxlen</code>=== | ===<code>maxlen</code>=== | ||
عدد صحيح | عدد صحيح يمثِّل الحد الأقصى للبايتات المراد قراءتها من المجرى المعطى. | ||
===<code>outbuf</code>=== | ===<code>outbuf</code>=== | ||
في حال إعطاء هذا المعامل الاختياري، فينبغي أن يشير إلى [[Ruby/String|السلسلة النصية]] التي ستتلقى البيانات المقروءة من المجرى. لن يحتوي <code>outbuf</code> إلا على البيانات المستلمة بعد استدعاء التابع حتى لو لم يكن فارغًا في البداية (أي ستُمسَح البيانات القديمة المخزنة فيه مسبقًا). | |||
==القيمة | ==القيمة المعادة== | ||
تعاد سلسلة نصية تحوي البيانات المقروءة من المجرى. | |||
==أمثلة== | ==أمثلة== | ||
سطر 50: | سطر 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 | *التابع [[Ruby/IO/printf|<code>printf</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 قسم | *[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
: يقرأ كل الأسطر الموجودة في المجرى الذي استدعي معه ثم يعيدها في مصفوفة.