التابع eval
الخاص بالصنف Kernel
في روبي
يقيم (Evaluates) التابع تعبيرات روبي الموجودة في سلاسل نصية. إذا أعطي الوسيط binding، والذي يجب أن يكون من النوع Binding
، فسيُجرى التقييم في السياق الخاص بها. في حال تمرير الوسيطين الاختياريين filename و lineno، فسيُستخدمان عند الإبلاغ عن أخطاء في الصياغة.
البنية العامة
eval(string [, binding [, filename [,lineno]]]) → obj
المعاملات
string
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
لا تُعاد أبدًا. انظر صفحةString#chop!
. متوفر فقط عند تحديد خيار سطر الأوامر -p/-n. - التابع
exec
: يستبدل التابع العملية الحالية عن طريق تشغيل الأمر الخارجي المعطى، والذي يمكن أن يأخذ أحد الأشكال التالية:
exec(commandline)
سطر أوامر نصي shell exec(cmdname, arg1, ...)
والذي يُمرّر إلى الصدفة (shell) القياسية، اسم أمر ووسيط واحد أو أكثر (بدون صدفة) اسم أمر و exec([cmdname, argv0], arg1, ...)
و argv
أو وسائط أكثر (بدون shell)
في الشكل الأول ، تؤخذ السلسلة النصية باعتبارها سطر أوامر والذي تثوم الصدفة بتسبطُيه (expansion ) قبل أن يتم تنفيذه.
الصدفة القياسية تعني دائمًا "/bin/sh"
على الأنظمة المشابهة ليونكس، مثل ENV["RUBYSHELL"]
(أو ENV["COMSPEC"]
على منصات Windows NT ) ، وما شابه.
إذا اتبعت السلسلة النصية من الشكل الأول (exec("command")
) هذه القواعد البسيطة:
لا أحرف مميزة (meta characters)، ولا كلمات مخصصة للصدفة أو مدمجة (built-in) ستستدعي روبي الأمر مباشرة دون صدفة
يمكنك إلزام استدعاء الصدفة بإضافة "؛" إلى السلسلة النصية (لأن "؛" حرف مميز).
لاحظ أن هذا السلوك يمكن ملاحظته في كون معرف العملية pid الذي تم الحصول عليه (القيمة المعادة من spawn () و IO#pid
لـ IO.popen
) هو معرف العملية pid للأمر المستدعى، وليس الصدفة .
في الشكل الثاني (exec("command1", "arg1",
...)
) ، يتم اعتبار الأول كاسم للأمر، أما البقية فتُمرّر كوسائط للأمر دون أن تبسطها الصدفة.
في الشكل الثالث (exec(["command", "argv0"],
"arg1", ...)
) ، يُبدأ بمصفوفة ثنائية في بداية الأمر، العنصر الأول هو الأمر الذي سيتم تنفيذه، أما الثاني فيُستخدم باعتباره قيمة argv[0]
، والتي قد تظهر في قوائم العملية (process listings).
من أجل تنفيذ الأمر، ستُستخدم إحدى استدعاءات النظام exec(2)
، لذلك فإنّ الأمر الجاري قد يرث بعض خصائص بيئة البرنامج الأصلي (بما في ذلك واصفات الملفات المفتوحة).
يمكن تعديل هذا السلوك عبر الوسيطين env
و options
. انظر ::spawn لمزيد من التفاصيل.
في حال فشل تنفيذ الأمر (عادةً عند عدم التمكن من إيجاد Errno::ENOENT
) يتم إطلاق استثناء SystemCallError
.
بعدل التابع خصائص العملية وفقا لقيمة الوسيط options
قبل استدعاء النظام exec(2)
. راجع ::spawn لمزيد من التفاصيل حول options
المعطى.
قد يُحتفظ بالخصائص المعدلة عند فشل استدعاء النظام exec(2)
.
على سبيل المثال، حدود الموارد الثابتة (hard resource limits) غير قابلة للاستعادة.
إذا لم يناسلبك هذا، فضع في اعتبارك إنشاء عملية فرعية (child process) باستخدام :: spawn أو #system
.