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

من موسوعة حسوب
< Ruby‏ | Kernel
اذهب إلى التنقل اذهب إلى البحث
ط (مراجعة وتدقيق)
 
(مراجعتان متوسطتان بواسطة مستخدم واحد آخر غير معروضتين)
سطر 3: سطر 3:
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Kernel]]
 
[[تصنيف: Ruby Kernel]]
يقيم (Evaluates) التابع تعبيرات روبي الموجودة في سلاسل نصية. إذا أعطي الوسيط binding، والذي يجب أن يكون من النوع <code>Binding</code>، فسيُجرى التقييم في السياق الخاص بها. في حال تمرير الوسيطين الاختياريين filename و lineno، فسيُستخدمان عند الإبلاغ عن أخطاء في الصياغة.
+
يقيّم (Evaluates) التابع <code>eval</code> تعبيرات روبي الموجودة في سلسلة نصية.  
==البنية العامة==
+
 
<syntaxhighlight lang="ruby">eval(string [, binding [, filename [,lineno]]])  → obj‎</syntaxhighlight>
+
== البنية العامة ==
 +
<syntaxhighlight lang="ruby">eval(string [, binding [, filename [,lineno]]])  → obj‎</syntaxhighlight>إذا أعطي المعامل <code>[[Ruby/Binding|binding]]</code>، فسيُجرَى التقييم في السياق الخاص به. في حال تمرير المعاملين الاختياريين <code>filename</code> و <code>lineno</code>، فسيُستخدمان عند الإبلاغ عن أخطاء الحاصلة في الصياغة.
 +
 
 
==المعاملات==
 
==المعاملات==
 
===<code>string‎</code>===
 
===<code>string‎</code>===
 +
سلسلة نصية تحتوي تعبيرات روبي.
  
 
===<code>binding‎</code>===
 
===<code>binding‎</code>===
 +
كائن من النوع <code>[[Ruby/Binding|Binding]]</code>. في حال تمريره، فسيُجرى التقييم في السياق الخاص به.
  
 
===<code>filename‎</code>===
 
===<code>filename‎</code>===
 +
يُستخدم عند الإبلاغ عن أخطاءٍ في الصياغة.
  
 
===<code>lineno‎</code>===
 
===<code>lineno‎</code>===
 +
يُستخدم عند الإبلاغ عن أخطاءٍ في الصياغة.
  
 
+
==القيمة المعادة==
==القيمة المُعادة==
+
تُعاد نتيجة تقييم التعبير المعطى.
  
 
==أمثلة==
 
==أمثلة==
سطر 28: سطر 34:
 
‎</syntaxhighlight>
 
‎</syntaxhighlight>
 
==انظر أيضا==
 
==انظر أيضا==
* التابع <code>[[Ruby/Kernel/chop|chop]]</code>: يكافئ التابع التعبير <code>($_.dup).chop!</code> ، باستثناء أنّ <code>nil</code> لا تُعاد أبدًا. انظر صفحة <code>String#chop!</code>. متوفر فقط عند تحديد خيار سطر الأوامر -p/-n.
+
* التابع <code>[[Ruby/Kernel/chop|chop]]</code>: يكافئ التعبير <code>($_.dup).chop!</code> ، باستثناء أنّ <code>nil</code> لا تُعاد أبدًا.
* التابع <code>[[Ruby/Kernel/exec|exec]]</code>: يستبدل التابع العملية الحالية عن طريق تشغيل الأمر الخارجي المعطى، والذي يمكن أن يأخذ أحد الأشكال التالية:
+
* التابع <code>[[Ruby/Kernel/exec|exec]]</code>: يستبدل العملية الحالية عن طريق تشغيل الأمر الخارجي المعطى.
<code>exec(commandline)</code> سطر أوامر نصي shell <code>exec(cmdname, arg1, ...)</code> والذي يُمرّر إلى الصدفة (shell) القياسية، اسم أمر ووسيط واحد أو أكثر (بدون صدفة) اسم أمر و <code>exec([cmdname, argv0], arg1, ...)</code> و <code>argv</code> أو وسائط أكثر (بدون shell)
 
في الشكل الأول ، تؤخذ السلسلة النصية باعتبارها سطر أوامر والذي تثوم الصدفة بتسبطُيه (expansion ) قبل أن يتم تنفيذه.
 
الصدفة القياسية تعني دائمًا <code>"/bin/sh"</code> على الأنظمة المشابهة ليونكس، مثل <code>ENV["RUBYSHELL"]</code> (أو <code>ENV["COMSPEC"]</code> على منصات Windows NT ) ، وما شابه.
 
إذا اتبعت السلسلة النصية من الشكل الأول (<code>exec("command")</code>) هذه القواعد البسيطة:
 
لا أحرف مميزة (meta characters)، ولا كلمات مخصصة للصدفة أو مدمجة (built-in) ستستدعي روبي الأمر مباشرة دون صدفة
 
يمكنك إلزام استدعاء الصدفة بإضافة "؛" إلى السلسلة النصية (لأن "؛" حرف مميز).
 
لاحظ أن هذا السلوك يمكن ملاحظته في كون معرف العملية pid الذي تم الحصول عليه (القيمة المعادة من spawn () و <code>IO#pid</code> لـ <code>IO.popen</code>) هو معرف العملية pid للأمر المستدعى، وليس الصدفة .
 
في الشكل الثاني (<code>exec("command1", "arg1",
 
...)</code>) ، يتم اعتبار الأول كاسم للأمر، أما البقية فتُمرّر كوسائط للأمر دون أن تبسطها الصدفة.
 
في الشكل الثالث (<code>exec(["command", "argv0"],
 
"arg1", ...)</code>) ، يُبدأ بمصفوفة ثنائية في بداية الأمر، العنصر الأول هو الأمر الذي سيتم تنفيذه، أما الثاني فيُستخدم باعتباره قيمة <code>argv[0]</code>، والتي قد تظهر في قوائم العملية (process listings).
 
من أجل تنفيذ الأمر، ستُستخدم إحدى استدعاءات النظام <code>exec(2)</code>، لذلك فإنّ الأمر الجاري قد يرث بعض خصائص بيئة البرنامج الأصلي (بما في ذلك واصفات الملفات المفتوحة).
 
يمكن تعديل هذا السلوك عبر الوسيطين <code>env</code> و <code>options</code>. انظر ::spawn لمزيد من التفاصيل.
 
في حال فشل تنفيذ الأمر (عادةً عند عدم التمكن من إيجاد <code>Errno::ENOENT</code>) يتم إطلاق استثناء <code>SystemCallError</code>.
 
بعدل التابع خصائص العملية وفقا لقيمة الوسيط <code>options</code> قبل استدعاء النظام <code>exec(2)</code>. راجع ::spawn لمزيد من التفاصيل حول <code>options</code> المعطى.
 
قد يُحتفظ بالخصائص المعدلة عند فشل استدعاء النظام <code>exec(2)</code>.
 
على سبيل المثال، حدود الموارد الثابتة (hard resource limits) غير قابلة للاستعادة.
 
إذا لم يناسلبك هذا، فضع في اعتبارك إنشاء عملية فرعية (child process) باستخدام :: spawn أو <code>#system</code>.
 
  
 
==مصادر==
 
==مصادر==
*[http://ruby-doc.org/core-2.5.1/Kernel.html#method-i-eval قسم التابع eval‎ في الصنف Kernel‎ في توثيق روبي الرسمي.]
+
*[http://ruby-doc.org/core-2.5.1/Kernel.html#method-i-eval قسم التابع eval‎ في الصنف Kernel‎ في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 11:43، 15 نوفمبر 2018

يقيّم (Evaluates) التابع eval تعبيرات روبي الموجودة في سلسلة نصية.

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

eval(string [, binding [, filename [,lineno]]])   obj

إذا أعطي المعامل binding، فسيُجرَى التقييم في السياق الخاص به. في حال تمرير المعاملين الاختياريين filename و lineno، فسيُستخدمان عند الإبلاغ عن أخطاء الحاصلة في الصياغة.

المعاملات

string‎

سلسلة نصية تحتوي تعبيرات روبي.

binding‎

كائن من النوع Binding. في حال تمريره، فسيُجرى التقييم في السياق الخاص به.

filename‎

يُستخدم عند الإبلاغ عن أخطاءٍ في الصياغة.

lineno‎

يُستخدم عند الإبلاغ عن أخطاءٍ في الصياغة.

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

تُعاد نتيجة تقييم التعبير المعطى.

أمثلة

مثال على استخدام التابع eval‎:

def get_binding(str)
  return binding
end
str = "hello"
eval "str + ' Fred'"                      #=> "hello Fred"
eval "str + ' Fred'", get_binding("bye")  #=> "bye Fred"

انظر أيضا

  • التابع chop: يكافئ التعبير ‎($_.dup).chop!‎ ، باستثناء أنّ nil لا تُعاد أبدًا.
  • التابع exec: يستبدل العملية الحالية عن طريق تشغيل الأمر الخارجي المعطى.

مصادر