الفرق بين المراجعتين ل"Ruby/Kernel/open"

من موسوعة حسوب
< Ruby‏ | Kernel
اذهب إلى التنقل اذهب إلى البحث
(تدقيق.)
 
سطر 3: سطر 3:
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Kernel]]
 
[[تصنيف: Ruby Kernel]]
ينشئ التابع <code>open</code> كائنًا من النوع <code>IO</code> متصلا بالمجرى أو الملف أو العملية الفرعية (subprocess) المحددة.
+
ينشئ التابع <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>) ، فسيُعامل باعتباره اسم الملف المراد فتحه باستخدام الوضع المحدد (افتراضيًا "<code>r</code>").
+
إذا بُدئ الوسيط <code>path</code> بشرطة عمودية (<code>"|"</code>) ، فسيتم إنشاء عملية فرعية (subprocess)، متصلة بالمُستدعي (caller) بواسطة زوج من الأنابيب (pipes). يمكن استخدام كائن من النوع [[Ruby/IO|<code>IO</code>]] المُعاد لأجل الكتابة في مجرى الدخل القياسي، أو القراءة من مجرى الخرج القياسي لهذه العملية الفرعية.
  
الوسيط <code>mode</code> هو إما سلسلة نصية أو عدد صحيح.  إن كان عددًا صحيحًا، فيجب أن يكون عبارة عن bitwise-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>"-|"</code>)، فستنشئ روبي عملية فرعية جديدة متصلة بالعملية الأم. أما إذا لم يكن الأمر (command) يساوي <code>"-"</code>، فستنفذ العملية الفرعية الأمر.
  
راجع توثيق <code>[[Ruby/IO/new|IO.new]]</code> لمزيد من المعلومات حول موجّهات <code>mode</code>.
+
إذا كانت العملية الفرعية هي روبي نفسها (مفتوحة عبر <code>"-|"</code>)، فسيعيد استدعاء التابع <code>open</code> القيمة <code>nil</code>.  وفي حال تمرير كتلة عند استدعاء <code>open</code>، فستنفذ الكتلة مرتين: مرة في العملية الأم ومرة في العملية الفرعية.
  
في حالة إنشاء ملف، قد تُعيّن أذوناته الأولية باستخدام الوسيط <code>perm</code>.  انظر <code>[[Ruby/File/new|File.new]]</code> وصفحات <code>open(2)‎</code> و <code>chmod(2)‎</code> لمزيد من المعلومات حول الأذونات.
+
الوسيط <code>block</code> سيكون كائنًا من النوع <code>[[Ruby/IO|IO]]</code> في العملية الأم والقيمة <code>nil</code> في العملية الفرعية. سيتم ريط الكائن [[Ruby/IO|<code>IO</code>]] الأب بالمجرى <code>‎$stdin</code> والمجرى <code>‎$stdout</code>. سيتم إنهاء العملية الفرعية في نهاية الكتلة.
 
 
في حال إعطاء كتلة، فستُسدعى بتمرير كائن <code>IO</code> كوسيط، والذي سيُغلق تلقائيًا عند إنهاء الكتلة.  ثم ستعاد قيمة الكتلة.
 
 
 
إذا بُدئ الوسيط <code>path</code> بشرطة عمودية (<code>"|"</code>) ، فسيتم إنشاء عملية فرعية (subprocess)، متصلة بالمُستدعي (caller) بواسطة زوج من الأنابيب (pipes).  يمكن استخدام كائن <code>IO</code> المُعاد لأجل الكتابة في مجرى الإدخال القياسي، أو القراءة من مجرى الإخراج القياسي لهذه العملية الفرعية.
 
 
 
إذا أُعقبت الشرطة العمودية بعلامة ناقص واحدة (<code>"|-"</code>) ، فستنشئ روبي عملية فرعية جديدة، والتي ستكون متصلة بالعملية الأم.  أما إذا لم يكن الأمر (command) يساوي<code>"-"</code>، فستنفذ العملية الفرعية الأمر.
 
 
 
إذا كانت العملية الفرعية هي  Ruby (مفتوحة عبر <code>"|-"</code>) ، استدعاء <code>open</code> سيعيد <code>nil</code>.  وفي حال تمرير كتلة عند استدعاء <code>open</code>، فستنفذ الكتلة مرتين - مرة في العملية الأم ومرة في العملية الفرعية.
 
 
 
الوسيط <code>block</code> سيكون كائنًا <code>IO</code> في العملية الأم و <code>nil</code> في العملية الفرعية. سيتم ريط أب (parent) الكائن <code>IO</code> ب <code>‎$stdin</code> و <code>‎$stdout</code>. سيتم إنهاء العملية الفرعية في نهاية الكتلة.
 
==البنية العامة==
 
<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> كائنًا من النوع <code>IO</code> متصلا بالمجرى أو الملف أو العملية الفرعية المحددة. وإذا كانت العملية الفرعية هي Ruby ، سيعيد <code>nil</code>
 
 
 
 
==أمثلة==
 
==أمثلة==
أمثلة على استخدام التابع <code>open‎</code>:
+
القراءة من الملف "testfile" عبر استخدام التابع <code>open‎</code>:<syntaxhighlight lang="ruby">open("testfile") do |f|
 
 
=== المثال الأول ===
 
القراءة من الملف "<code>testfile</code>":
 
<syntaxhighlight lang="ruby">open("testfile") do |f|
 
 
   print f.gets
 
   print f.gets
end</syntaxhighlight>الناتج:<syntaxhighlight lang="ruby">This is line one
+
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 lang="ruby">Wed Apr  9 08:56:31 CDT 2003‎</syntaxhighlight>
+
</syntaxhighlight>سينتج عن تنفيذ المثال ناتج شبيه بالناتج التالي:<syntaxhighlight lang="text">Wed Apr  9 08:56:31 CDT 2003‎</syntaxhighlight>مثالٌ آخر حول فتح عملية فرعية تُشغّل نفس برنامج روبي عبر استخدام التابع <code>open‎</code>:<syntaxhighlight lang="ruby">f = open("|-", "w+")
 
 
=== المثال الثالث ===
 
فتح عملية فرعية تُشغّل نفس برنامج Ruby:<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|
الناتج:<syntaxhighlight lang="ruby">Got: in Child‎</syntaxhighlight>
 
 
 
=== المثال الرابع ===
 
فتح عملية فرعية باستخدام كتلة لاستلام كائن <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>
الناتج:<syntaxhighlight lang="ruby">Got: in Child‎</syntaxhighlight>
 
 
==انظر أيضا==
 
==انظر أيضا==
* التابع <code>[[Ruby/Kernel/fork|fork]]</code>: ينشئ التابع <code>fork</code>  عملية فرعية (subprocess).  
+
*التابع <code>[[Ruby/Kernel/fork|fork]]</code>: ينشئ عملية فرعية (subprocess).
 
 
 
==مصادر==
 
==مصادر==
*[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).

مصادر