التابع open
الخاص بالصنف Kernel
في روبي
ينشئ التابع 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).