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

من موسوعة حسوب
< Ruby‏ | Kernel
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>open‎</code> الخاص بالصنف <code>Kernel</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف...'
 
تدقيق.
 
(مراجعة متوسطة واحدة بواسطة مستخدم واحد آخر غير معروضة)
سطر 3: سطر 3:
[[تصنيف: Ruby Method]]
[[تصنيف: Ruby Method]]
[[تصنيف: Ruby Kernel]]
[[تصنيف: Ruby Kernel]]
ينشئ التابع open كائنًا من النوع <code>IO</code> متصلا بالمجرى أو الملف أو العملية الفرعية (subprocess) المحددة.
ينشئ التابع <code>open</code> كائنًا من النوع <code>[[Ruby/IO|IO]]</code> متصلًا بالمجرى أو الملف أو العملية الفرعية (subprocess) المحددة.
إذا لم يبدأ <code>path</code> بشرطة عمودية (<code>|</code>) ، فسيُعامل كاسم الملف المراد فتحه باستخدام الوضع المحدد (افتراضيًا "r").
==البنية العامة==
<code>mode</code> هو إما سلسلة نصية أو عدد صحيح.  إن كان عددًا صحيحًا، فيجب أن يكون عبارة عن bitwise-or لراية open(2)، مثل File :: RDWR أو File :: EXCL.  أما إذا كان سلسلة نصية، فهو إما "fmode" أو "fmode: ext_enc" أو "fmode: ext_enc: int_enc".
<syntaxhighlight lang="ruby">open(path [, mode [, perm]] [, opt]) → io or nil
راجع توثيق <code>IO.new</code> لمزيد من المعلومات حول موجّهات <code>mode</code>.
open(path [, mode [, perm]] [, opt]) {|io| block } → obj‎</syntaxhighlight>في حال إعطاء كتلة، فستُسدعَى بتمرير كائن من النوع [[Ruby/IO|<code>IO</code>]] كوسيط إليها، والذي سيُغلق تلقائيًا عند الانتهاء من تنفيذ الكتلة ثم سيعاد الناتج.
في حالة إنشاء ملف، قد تُعيّن أذوناته الأولية باستخدام الوسيط <code>perm</code>. انظر <code>File.new</code> وصفحات open(2) و chmod(2) لمزيد من المعلومات حول للأذونات.
في حال إعطاء كتلة، فستسدعى بتمرير كائن <code>IO</code> كوسيط، وسيُغلق <code>IO</code> تلقائيًا عند إنهاء الكتلة.  وستعاد قيمة الكتلة.
إذا بُدئت <code>path</code> بشرطة عمودية (<code>"|"</code>) ، فسيتم إنشاء عملية فرعية، متصلة بالمُستدعي (caller) بواسطة زوج من الأنابيب (pipes).  يمكن استخدام كائن <code>IO</code> المُعاد للكتابة في مجرى الإدخال القياسي والقراءة من مجرى الإخراج القياسي لهذه العملية الفرعية.
إذا أعقُبت الشرطة العمودية بعلامة ناقص واحدة (<code>"|-"</code>) ، فستنشئ روبي عملية فرعية جديدة، والتي ستكون متصلة بالعملية الأم.  أما إذا لم يكن الأمر هو <code>"-"</code>، فستنفذ العملية الفرعية الأمر.
عندما تكون العملية الفرعية هي Ruby (مفتوحة عبر <code>"|-"</code>) ، استدعاء <code>open</code> سيعيد <code>nil</code>.  في حال تمرير كتلة عند استدعاء open، فستنفذ الكتلة مرتين - مرة في العملية الأم ومرة في العملية الفرعية.
الوسيط block سيكون كائنًا <code>IO</code> في العملية الأم و <code>nil</code> في العملية الفرعية. سيتم ريط أب (parent') الكائن <code>IO</code> ب $stdin و $stdout..  سيتم إنهاء العملية الفرعية في نهاية الكتلة.
أمثلة <code>¶</code> <code>↑</code>
القراءة من الملف "testfile":
 
الناتج:


افتح عملية فرعية وقراءة ناتجها:
إذا بُدئ الوسيط <code>path</code> بشرطة عمودية (<code>"|"</code>) ، فسيتم إنشاء عملية فرعية (subprocess)، متصلة بالمُستدعي (caller) بواسطة زوج من الأنابيب (pipes). يمكن استخدام كائن من النوع [[Ruby/IO|<code>IO</code>]] المُعاد لأجل الكتابة في مجرى الدخل القياسي، أو القراءة من مجرى الخرج القياسي لهذه العملية الفرعية.


الناتج:
إذا أُعقبت الشرطة العمودية بعلامة ناقص واحدة (<code>"-|"</code>)، فستنشئ روبي عملية فرعية جديدة متصلة بالعملية الأم. أما إذا لم يكن الأمر (command) يساوي <code>"-"</code>، فستنفذ العملية الفرعية الأمر.
<syntaxhighlight lang="ruby">Wed Apr  9 08:56:31 CDT 2003‎</syntaxhighlight>
افتح عملية فرعية تُشغّل نفس برنامج Ruby:


الناتج:
إذا كانت العملية الفرعية هي روبي نفسها (مفتوحة عبر <code>"-|"</code>)، فسيعيد استدعاء التابع <code>open</code> القيمة <code>nil</code>.  وفي حال تمرير كتلة عند استدعاء <code>open</code>، فستنفذ الكتلة مرتين: مرة في العملية الأم ومرة في العملية الفرعية.
<syntaxhighlight lang="ruby">Got: in Child‎</syntaxhighlight>
افتح عملية فرعية باستخدام كتلة لاستلام كائن <code>IO</code>:


الناتج:
الوسيط <code>block</code> سيكون كائنًا من النوع <code>[[Ruby/IO|IO]]</code> في العملية الأم والقيمة <code>nil</code> في العملية الفرعية. سيتم ريط الكائن [[Ruby/IO|<code>IO</code>]] الأب بالمجرى <code>‎$stdin</code> والمجرى <code>‎$stdout</code>. سيتم إنهاء العملية الفرعية في نهاية الكتلة.
<syntaxhighlight lang="ruby">Got: in Child‎</syntaxhighlight>
==البنية العامة==
<syntaxhighlight lang="ruby">open(path [, mode [, perm]] [, opt]) → io or nil
open(path [, mode [, perm]] [, opt]) {|io| block }  → obj‎</syntaxhighlight>
==المعاملات==
==المعاملات==
===<code>path‎</code>===
===<code>path‎</code>===
 
مسار الملف المراد فتحه. إذا لم يبدأ بخط عمودي (<code>|</code>) ، فسيُعدُّ اسمَ الملف المراد فتحه باستخدام الوضع <code>mode</code> المحدد.
===<code>mode‎</code>===
===<code>mode‎</code>===
الوضع الذي سيُفتَح الملف فيه. القيمة الافتراضية هي: "r". يكون إمَّا سلسلة نصية أو عدد صحيح. إن كان عددًا صحيحًا، فيجب أن تطبق العملية OR الثنائية على رايات الدالة <code>open(2)‎</code>، مثل <code>File:: RDWR</code> أو <code>File::EXCL</code>.  أما إذا كان سلسلة نصية، فسيكون إما "<code>fmode</code>" أو "<code>fmode: ext_enc</code>" أو "<code>fmode: ext_enc: int_enc</code>".


راجع توثيق التابع <code>[[Ruby/IO/new|IO.new]]</code> لمزيد من المعلومات حول المعامل <code>mode</code>.
===<code>perm‎</code>===
===<code>perm‎</code>===
 
في حالة إنشاء ملف، قد يعين المعامل <code>perm‎</code> أذوناته الأولية. انظر التابع <code>[[Ruby/File/new|File.new]]</code> والدالة <code>open(2)‎</code> والدالة <code>chmod(2)‎</code> لمزيد من المعلومات حول الأذونات.
===<code>opt‎</code>===
===<code>opt‎</code>===
 
يحدد الخيارات لفتح الملف.
 
==القيمة المعادة==
==القيمة المُعادة==
يعاد كائنٌ من النوع [[Ruby/IO|<code>IO</code>]] متصلًا بالمجرى أو الملف أو العملية الفرعية المحددة. وإذا كانت العملية الفرعية هي روبي، فستُعاد القيمة <code>nil</code>.
 
==أمثلة==
==أمثلة==
مثال على استخدام التابع <code>open‎</code>:
القراءة من الملف "testfile" عبر استخدام التابع <code>open‎</code>:<syntaxhighlight lang="ruby">open("testfile") do |f|
<syntaxhighlight lang="ruby">open("testfile") do |f|
   print f.gets
   print f.gets
end‎</syntaxhighlight>
end</syntaxhighlight>سينتج عن تنفيذ المثال ناتج شبيه بالناتج التالي:<syntaxhighlight lang="text">This is line one
</syntaxhighlight>مثالٌ آخر حول فتح عملية فرعية وقراءة ناتجها عبر استخدام التابع <code>open‎</code>:<syntaxhighlight lang="ruby">cmd = open("|date")
print cmd.gets
cmd.close
</syntaxhighlight>سينتج عن تنفيذ المثال ناتج شبيه بالناتج التالي:<syntaxhighlight lang="text">Wed Apr  9 08:56:31 CDT 2003‎</syntaxhighlight>مثالٌ آخر حول فتح عملية فرعية تُشغّل نفس برنامج روبي عبر استخدام التابع <code>open‎</code>:<syntaxhighlight lang="ruby">f = open("|-", "w+")
if f.nil?
  puts "in Child"
  exit
else
  puts "Got: #{f.gets}"
end</syntaxhighlight>سينتج عن تنفيذ المثال ناتج شبيه بالناتج التالي:<syntaxhighlight lang="text">Got: in Child‎</syntaxhighlight>يشرح المثال الأخير كيفية فتح عملية فرعية باستخدام كتلة لاستلام كائن من النوع <code>IO</code>:<syntaxhighlight lang="ruby">open "|-" do |f|
  if f then
    # parent process
    puts "Got: #{f.gets}"
  else
    # child process
    puts "in Child"
  end
end</syntaxhighlight>سينتج عن تنفيذ المثال ناتج شبيه بالناتج التالي:<syntaxhighlight lang="ruby">Got: in Child‎</syntaxhighlight>
==انظر أيضا==
==انظر أيضا==
* التابع <code>[[Ruby/Kernel/loop|loop]]</code>: ينفذ التابع loop الكتلة البرمجية بشكل متكرر.
*التابع <code>[[Ruby/Kernel/fork|fork]]</code>: ينشئ عملية فرعية (subprocess).
* التابع <code>[[Ruby/Kernel/p|p]]</code>: يكتب التابع p لكل كائن يُمرر إليه ناتج التعبير يكتب مباشرة .<code>inspect</code>، متبوعًا بسطر جديد في مجرى الإخراج القياسي للبرنامج.
 
==مصادر==
==مصادر==
*[http://ruby-doc.org/core-2.5.1/Kernel.html#method-i-open قسم التابع open‎ في الصنف Kernel‎ في توثيق روبي الرسمي.]
*[http://ruby-doc.org/core-2.5.1/Kernel.html#method-i-open قسم التابع open‎ في الصنف Kernel‎ في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 15:41، 15 نوفمبر 2018

ينشئ التابع open كائنًا من النوع IO متصلًا بالمجرى أو الملف أو العملية الفرعية (subprocess) المحددة.

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

open(path [, mode [, perm]] [, opt])  io or nil
open(path [, mode [, perm]] [, opt]) {|io| block }   obj

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

إذا بُدئ الوسيط path بشرطة عمودية ("|") ، فسيتم إنشاء عملية فرعية (subprocess)، متصلة بالمُستدعي (caller) بواسطة زوج من الأنابيب (pipes). يمكن استخدام كائن من النوع IO المُعاد لأجل الكتابة في مجرى الدخل القياسي، أو القراءة من مجرى الخرج القياسي لهذه العملية الفرعية.

إذا أُعقبت الشرطة العمودية بعلامة ناقص واحدة ("-|")، فستنشئ روبي عملية فرعية جديدة متصلة بالعملية الأم. أما إذا لم يكن الأمر (command) يساوي "-"، فستنفذ العملية الفرعية الأمر.

إذا كانت العملية الفرعية هي روبي نفسها (مفتوحة عبر "-|")، فسيعيد استدعاء التابع open القيمة nil. وفي حال تمرير كتلة عند استدعاء open، فستنفذ الكتلة مرتين: مرة في العملية الأم ومرة في العملية الفرعية.

الوسيط block سيكون كائنًا من النوع IO في العملية الأم والقيمة nil في العملية الفرعية. سيتم ريط الكائن IO الأب بالمجرى ‎$stdin والمجرى ‎$stdout. سيتم إنهاء العملية الفرعية في نهاية الكتلة.

المعاملات

path‎

مسار الملف المراد فتحه. إذا لم يبدأ بخط عمودي (|) ، فسيُعدُّ اسمَ الملف المراد فتحه باستخدام الوضع mode المحدد.

mode‎

الوضع الذي سيُفتَح الملف فيه. القيمة الافتراضية هي: "r". يكون إمَّا سلسلة نصية أو عدد صحيح. إن كان عددًا صحيحًا، فيجب أن تطبق العملية OR الثنائية على رايات الدالة open(2)‎، مثل File:: RDWR أو File::EXCL. أما إذا كان سلسلة نصية، فسيكون إما "fmode" أو "fmode: ext_enc" أو "fmode: ext_enc: int_enc".

راجع توثيق التابع IO.new لمزيد من المعلومات حول المعامل mode.

perm‎

في حالة إنشاء ملف، قد يعين المعامل perm‎ أذوناته الأولية. انظر التابع File.new والدالة open(2)‎ والدالة chmod(2)‎ لمزيد من المعلومات حول الأذونات.

opt‎

يحدد الخيارات لفتح الملف.

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

يعاد كائنٌ من النوع IO متصلًا بالمجرى أو الملف أو العملية الفرعية المحددة. وإذا كانت العملية الفرعية هي روبي، فستُعاد القيمة nil.

أمثلة

القراءة من الملف "testfile" عبر استخدام التابع open‎:

open("testfile") do |f|
  print f.gets
end

سينتج عن تنفيذ المثال ناتج شبيه بالناتج التالي:

This is line one

مثالٌ آخر حول فتح عملية فرعية وقراءة ناتجها عبر استخدام التابع open‎:

cmd = open("|date")
print cmd.gets
cmd.close

سينتج عن تنفيذ المثال ناتج شبيه بالناتج التالي:

Wed Apr  9 08:56:31 CDT 2003‎

مثالٌ آخر حول فتح عملية فرعية تُشغّل نفس برنامج روبي عبر استخدام التابع open‎:

f = open("|-", "w+")
if f.nil?
  puts "in Child"
  exit
else
  puts "Got: #{f.gets}"
end

سينتج عن تنفيذ المثال ناتج شبيه بالناتج التالي:

Got: in Child‎

يشرح المثال الأخير كيفية فتح عملية فرعية باستخدام كتلة لاستلام كائن من النوع IO:

open "|-" do |f|
  if f then
    # parent process
    puts "Got: #{f.gets}"
  else
    # child process
    puts "in Child"
  end
end

سينتج عن تنفيذ المثال ناتج شبيه بالناتج التالي:

Got: in Child

انظر أيضا

  • التابع fork: ينشئ عملية فرعية (subprocess).

مصادر