التابع 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).