التابع open‎ الخاص بالصنف Kernel في روبي

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث

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

إذا لم يبدأ الوسيط path (انظر فقرة البنية العامة) بشرطة عمودية (|) ، فسيُعامل باعتباره اسم الملف المراد فتحه باستخدام الوضع المحدد (افتراضيًا "r").

الوسيط mode هو إما سلسلة نصية أو عدد صحيح. إن كان عددًا صحيحًا، فيجب أن يكون عبارة عن bitwise-or لرايات open(2)‎، مثل File:: RDWR أو File::EXCL. أما إذا كان سلسلة نصية، فسيكون إما "fmode" أو "fmode: ext_enc" أو "fmode: ext_enc: int_enc".

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

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

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

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

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

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

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

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

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

المعاملات

path‎

مُوجّه.

mode‎

مُوجه.

perm‎

يعيّن الأذونات الأولية.

opt‎

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

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

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

أمثلة

أمثلة على استخدام التابع open‎:

المثال الأول

القراءة من الملف "testfile":

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

الناتج:

This is line one

المثال الثاني

فتح عملية فرعية وقراءة ناتجها:

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

الناتج:

Wed Apr  9 08:56:31 CDT 2003

المثال الثالث

فتح عملية فرعية تُشغّل نفس برنامج Ruby:

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: ينشئ التابع fork  عملية فرعية (subprocess).

مصادر