الفرق بين المراجعتين لصفحة: «Ruby/Kernel/open»
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) تدقيق. |
||
سطر 3: | سطر 3: | ||
[[تصنيف: Ruby Method]] | [[تصنيف: Ruby Method]] | ||
[[تصنيف: Ruby Kernel]] | [[تصنيف: Ruby Kernel]] | ||
ينشئ التابع <code>open</code> كائنًا من النوع <code>IO</code> | ينشئ التابع <code>open</code> كائنًا من النوع <code>[[Ruby/IO|IO]]</code> متصلًا بالمجرى أو الملف أو العملية الفرعية (subprocess) المحددة. | ||
==البنية العامة== | |||
<syntaxhighlight lang="ruby">open(path [, mode [, perm]] [, opt]) → io or nil | |||
open(path [, mode [, perm]] [, opt]) {|io| block } → obj</syntaxhighlight>في حال إعطاء كتلة، فستُسدعَى بتمرير كائن من النوع [[Ruby/IO|<code>IO</code>]] كوسيط إليها، والذي سيُغلق تلقائيًا عند الانتهاء من تنفيذ الكتلة ثم سيعاد الناتج. | |||
إذا | إذا بُدئ الوسيط <code>path</code> بشرطة عمودية (<code>"|"</code>) ، فسيتم إنشاء عملية فرعية (subprocess)، متصلة بالمُستدعي (caller) بواسطة زوج من الأنابيب (pipes). يمكن استخدام كائن من النوع [[Ruby/IO|<code>IO</code>]] المُعاد لأجل الكتابة في مجرى الدخل القياسي، أو القراءة من مجرى الخرج القياسي لهذه العملية الفرعية. | ||
إذا أُعقبت الشرطة العمودية بعلامة ناقص واحدة (<code>"-|"</code>)، فستنشئ روبي عملية فرعية جديدة متصلة بالعملية الأم. أما إذا لم يكن الأمر (command) يساوي <code>"-"</code>، فستنفذ العملية الفرعية الأمر. | |||
إذا كانت العملية الفرعية هي روبي نفسها (مفتوحة عبر <code>"-|"</code>)، فسيعيد استدعاء التابع <code>open</code> القيمة <code>nil</code>. وفي حال تمرير كتلة عند استدعاء <code>open</code>، فستنفذ الكتلة مرتين: مرة في العملية الأم ومرة في العملية الفرعية. | |||
الوسيط <code>block</code> سيكون كائنًا من النوع <code>[[Ruby/IO|IO]]</code> في العملية الأم والقيمة <code>nil</code> في العملية الفرعية. سيتم ريط الكائن [[Ruby/IO|<code>IO</code>]] الأب بالمجرى <code>$stdin</code> والمجرى <code>$stdout</code>. سيتم إنهاء العملية الفرعية في نهاية الكتلة. | |||
==المعاملات== | ==المعاملات== | ||
===<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>. | ||
==أمثلة== | ==أمثلة== | ||
القراءة من الملف "testfile" عبر استخدام التابع <code>open</code>:<syntaxhighlight lang="ruby">open("testfile") do |f| | |||
القراءة من الملف "<code> | |||
<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> | </syntaxhighlight>مثالٌ آخر حول فتح عملية فرعية وقراءة ناتجها عبر استخدام التابع <code>open</code>:<syntaxhighlight lang="ruby">cmd = open("|date") | ||
فتح عملية فرعية وقراءة ناتجها:<syntaxhighlight lang="ruby">cmd = open("|date") | |||
print cmd.gets | print cmd.gets | ||
cmd.close | cmd.close | ||
</syntaxhighlight> | </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? | if f.nil? | ||
puts "in Child" | puts "in Child" | ||
سطر 64: | سطر 41: | ||
else | else | ||
puts "Got: #{f.gets}" | puts "Got: #{f.gets}" | ||
end</syntaxhighlight> | end</syntaxhighlight>سينتج عن تنفيذ المثال ناتج شبيه بالناتج التالي:<syntaxhighlight lang="text">Got: in Child</syntaxhighlight>يشرح المثال الأخير كيفية فتح عملية فرعية باستخدام كتلة لاستلام كائن من النوع <code>IO</code>:<syntaxhighlight lang="ruby">open "|-" do |f| | ||
فتح عملية فرعية باستخدام كتلة لاستلام كائن <code>IO</code>:<syntaxhighlight lang="ruby">open "|-" do |f| | |||
if f then | if f then | ||
# parent process | # parent process | ||
سطر 76: | سطر 49: | ||
puts "in Child" | puts "in Child" | ||
end | end | ||
end</syntaxhighlight> | end</syntaxhighlight>سينتج عن تنفيذ المثال ناتج شبيه بالناتج التالي:<syntaxhighlight lang="ruby">Got: in Child</syntaxhighlight> | ||
==انظر أيضا== | ==انظر أيضا== | ||
* التابع <code>[[Ruby/Kernel/fork|fork]]</code>: ينشئ | *التابع <code>[[Ruby/Kernel/fork|fork]]</code>: ينشئ عملية فرعية (subprocess). | ||
==مصادر== | ==مصادر== | ||
*[http://ruby-doc.org/core-2.5.1/Kernel.html#method-i-open قسم | *[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).