الفرق بين المراجعتين لصفحة: «Ruby/Topics»
جميل-بيلوني (نقاش | مساهمات) لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) لا ملخص تعديل |
||
سطر 77: | سطر 77: | ||
==الأصناف والوحدات== | ==الأصناف والوحدات== | ||
===[[Ruby/ARGF|ARGF]]=== | ===[[Ruby/ARGF|ARGF]]=== | ||
الصنف <code>ARGF</code> هو مجرى (stream) صُمِّم ليُستخدَم في الملفات البرمجية (scritps) التي تُعالج الملفات المُمرَّرة إليها على شكل وسائط في سطر الأوامر (command-line arguments)، أو المُمرَّرة عبر مجرى الدخل القياسي (STDIN). | |||
===[[Ruby/ArgumentError|ArgumentError]]=== | ===[[Ruby/ArgumentError|ArgumentError]]=== | ||
يُطلق الاستثناء <code>ArgumentError</code> عندما تكون الوسائط (arguments) غير صالحة، ولا يكون هناك صنف <code>[[Ruby/Exception|Exception]]</code> أكثر تحديدًا. | |||
===[[Ruby/Array|Array]]=== | ===[[Ruby/Array|Array]]=== | ||
المصفوفات هي مجموعات مُرتَّبة ومُفهرسة بالأعداد الصحيحة (integer-indexed) ومُكونة من أي نوع من الكائنات. | |||
===[[Ruby/BasicObject|BasicObject]]=== | ===[[Ruby/BasicObject|BasicObject]]=== | ||
الصنف <code>BasicObject</code> هو الصنف الأب لجميع الأصناف في روبي، وهو صنف فارغ. | |||
===[[Ruby/Binding|Binding]]=== | ===[[Ruby/Binding|Binding]]=== | ||
تُغلِّف كائنات الصنف <code>Binding</code> سياق التنفيذ (execution context) في مكان معين في الشيفرة البرمجية، وتحتفظ بذلك السياق لاستخدامه مستقبلًا. يُحتفَظ بالمتغيرات، والتوابع، وقيمة<code>self</code>، وربما كتلة المكرر (iterator block) وكل ما يمكن الوصول إليه في هذا السياق. يمكن إنشاء كائنات الصنف <code>Binding</code> باستخدام التابع <code>Kernel.binding</code>، واستدعاؤها بوساطة التابع <code>Kernel.set_trace_func</code>. | |||
===[[Ruby/Class|Class]]=== | ===[[Ruby/Class|Class]]=== | ||
تُعدُّ الأصناف كائناتٍ من الدرجة الأولى (first-class objects) في روبي، وتعدُّ جميعها نُسخٌ من الصنف <code>Class</code>. | |||
===[[Ruby/ClosedQueueError|ClosedQueueError]]=== | ===[[Ruby/ClosedQueueError|ClosedQueueError]]=== | ||
===[[Ruby/Comparable|Comparable]]=== | ===[[Ruby/Comparable|Comparable]]=== | ||
يُستخدم المخلوط (mixin) <code>Comparable</code> من قبل الأصناف التي يمكن ترتيب كائناتها. يجب أن يحدِّد الصنفُ المعاملَ <code><=></code> ، الذي يوازن الكائن المستقبِل (receiver) مع كائن آخر ، ويعيد -1، أو 0، أو +1 إن كان المُستقبِل أصغر من الكائن الآخر، أو يساويه، أو أكبر منه على التوالي. | |||
===[[Ruby/Complex|Complex]]=== | ===[[Ruby/Complex|Complex]]=== | ||
يمكن تمثيل الأعداد العقدية (تُسمّى أيضًا أعدادًا مركبةً [complex number]) كزوج مكون من عدد حقيقي ووحدة تخلية (العدد <code>i</code>) وفق الشكل <code>a+bi</code>، إذ <code>a</code> هو الجزء الحقيقي، و <code>b</code> هو الجزء التخيلي و <code>i</code> هو الوحدة الخيالية. | |||
===[[Ruby/Complex::compatible|Complex::compatible]]=== | ===[[Ruby/Complex::compatible|Complex::compatible]]=== | ||
===[[Ruby/ConditionVariable|ConditionVariable]]=== | ===[[Ruby/ConditionVariable|ConditionVariable]]=== | ||
توسع كائنات الصنف <code>ConditionVariable</code> عمل الصنف <code>[[Ruby/Mutex|Mutex]]</code>. فمن الممكن باستخدام المتغيرات الشرطية إيقاف مهمة حرجة (critical section) في أثناء تنفيذها إلى حين إتاحة مورد ما. | |||
===[[Ruby/Continuation|Continuation]]=== | ===[[Ruby/Continuation|Continuation]]=== | ||
تُولّد الكائنات <code>Continuation</code> بواسطة التابع <code>Kernel.callcc</code> بعد استيراد <code>continuation</code> عبر <code>require</code>. تحمل هذه الكائنات عنوان العودة (return address) وسياق التنفيذ (execution context)، مما يتيح العودة إلى نهاية الكتلة <code>callcc</code> من أي مكان في البرنامج. | |||
===[[Ruby/Data|Data]]=== | ===[[Ruby/Data|Data]]=== | ||
===[[Ruby/Dir|Dir]]=== | ===[[Ruby/Dir|Dir]]=== | ||
كائنات الصنف <code>Dir</code> هي مجاري مجلدات (directory streams) تمثِّل الجلدات في نظام الملفات الأساسي لنظام التشغيل. فهي توفر طرائق متعددة لعرض المجلدات ومحتوياتها. انظر أيضًا صفحة الصنف <code>File</code> لمزيد من المعلومات. | |||
===[[Ruby/ENV|ENV]]=== | ===[[Ruby/ENV|ENV]]=== | ||
يشبه الصنف <code>ENV</code> الجداول <code>[[Ruby/Hash|Hash]]</code> كثيرًا ويُستعمل للوصول إلى متغيرات البيئة. | |||
===[[Ruby/EOFError|EOFError]]=== | ===[[Ruby/EOFError|EOFError]]=== | ||
يٌطلَق الخطأ <code>EOFError</code> من طرف بعض عمليات الصنف <code>[[Ruby/IO|IO]]</code> عندما تصل إلى نهاية الملف. | |||
===[[Ruby/Encoding|Encoding]]=== | ===[[Ruby/Encoding|Encoding]]=== | ||
يمثل الصنف <code>Encoding</code> ترميز المحارف الذي يمكننا استخدامه في لغة روبي. | |||
===[[Ruby/Encoding::CompatibilityError|Encoding::CompatibilityError]]=== | ===[[Ruby/Encoding::CompatibilityError|Encoding::CompatibilityError]]=== | ||
يُرمى الاستثناء <code>CompatibilityError</code> من قبل توابع الصّنفين <code>String</code> و <code>[[Ruby/Encoding|Encoding]]</code> عندما لا يتوافق ترميز المصدر مع ترميز الهدف. | |||
===[[Ruby/Encoding::Converter|Encoding::Converter]]=== | ===[[Ruby/Encoding::Converter|Encoding::Converter]]=== | ||
يُستعمَل الصنف <code>Encoding::Converter</code> في عمليات تحويل الترميز في السلاسل النصية. | |||
===[[Ruby/Encoding::ConverterNotFoundError|Encoding::ConverterNotFoundError]]=== | ===[[Ruby/Encoding::ConverterNotFoundError|Encoding::ConverterNotFoundError]]=== | ||
يُرمى الاستثناء <code>ConverterNotFoundError</code> من قبل توابع تبديل التّرميز (transcoding) عندما لا يتوافق ترميزٌ باسمٍ معيّنٍ مع محوّلٍ (converter) محدَّد. | |||
===[[Ruby/Encoding::InvalidByteSequenceError|Encoding::InvalidByteSequenceError]]=== | ===[[Ruby/Encoding::InvalidByteSequenceError|Encoding::InvalidByteSequenceError]]=== | ||
يُرمَى الاستنثناء <code>InvalidByteSequenceError</code> من قبل توابع الصّنفين <code>String</code> و <code>[[Ruby/Encoding|Encoding]]</code> عندما تحوي السّلسلة النّصية التي يجري تحويل ترميزها بايتًا غير صالح إما للتّرميز المصدر أو التّرميز الهدف المراد التحويل إليه. | |||
===[[Ruby/Encoding::UndefinedConversionError|Encoding::UndefinedConversionError]]=== | ===[[Ruby/Encoding::UndefinedConversionError|Encoding::UndefinedConversionError]]=== | ||
يُرمَى الاستثناء <code>UndefinedConversionError</code> من قبل توابع الصّنفين <code>String</code> و <code>[[Ruby/Encoding|Encoding]]</code> عندما تفشل عملية تبديل التّرميز (transcoding). | |||
===[[Ruby/EncodingError|EncodingError]]=== | ===[[Ruby/EncodingError|EncodingError]]=== | ||
يُمثِّل الصنف <code>EncodingError</code> الصِّنفَ القاعديَّ (base class) لجميعِ أخطاء التّرميز (الصنف <code>[[Ruby/Encoding|Encoding]]</code>). | |||
===[[Ruby/Enumerable|Enumerable]]=== | ===[[Ruby/Enumerable|Enumerable]]=== | ||
===[[Ruby/Enumerator|Enumerator]]=== | ===[[Ruby/Enumerator|Enumerator]]=== | ||
سطر 105: | سطر 145: | ||
===[[Ruby/Enumerator::Yielder|Enumerator::Yielder]]=== | ===[[Ruby/Enumerator::Yielder|Enumerator::Yielder]]=== | ||
===[[Ruby/Errno|Errno]]=== | ===[[Ruby/Errno|Errno]]=== | ||
تُنشَأ الوحدة <code>Errno</code> ديناميكيًّا لتنظيم تفاصيل الأخطاء تُبلِّغ أنظمة عنها وإرسالها إلى أصناف روبي، مع توليد صنف فرعي من الصنف <code>[[Ruby/SystemCallError|SystemCallError]]</code> خاص بكل رقم خطأٍ. | |||
===[[Ruby/Exception|Exception]]=== | ===[[Ruby/Exception|Exception]]=== | ||
تُستخدَم الكائنات السليلة من الصنف <code>Exception</code> للتواصل بين التّابع <code>[[Ruby/Kernel/raise|Kernel.raise]]</code> وتصريحات <code>rescue</code> في الكتل (blocks) من الشكل <code>[[Ruby/miscellaneous#BEGIN .D9.88 END|begin...end]]</code>. تَحمل كائنات الصنف<code>Exception</code> معلوماتٍ عن الاستثناء المَرمي مثل نوعه (اسم صنف الاستثناء)، وسلسلةً نصيّةً وصفيّةً اختياريّة، ومعلوماتِ تتبّعٍ اختيارية. | |||
===[[Ruby/FalseClass|FalseClass]]=== | ===[[Ruby/FalseClass|FalseClass]]=== | ||
القيمة <code>false</code> العامة (global) هي النسخة الوحيدة من الصنف <code>FalseClass</code> وتمثِّل قيمة الخطأ (false) في التعابير المنطقية (boolean expressions). يوفر هذا الصنف معاملات تسمح للقيمة <code>false</code> بالمساهمة بشكل صحيح في التعابير المنطقية. | |||
===[[Ruby/Fiber|Fiber]]=== | ===[[Ruby/Fiber|Fiber]]=== | ||
الألياف (Fibers) هي حقولٌ أساسيّةٌ (primitives) تُستخدم في تنفيذ تعدّد المهام التشاركي (cooperative concurrency) للمهام الخفيفة (light weight) أي التي تستهلك جزءًا صغيرًا من الذاكرة. | |||
===[[Ruby/FiberError|FiberError]]=== | ===[[Ruby/FiberError|FiberError]]=== | ||
يُرمى الاستثناء <code>FiberError</code> عند محاولة إجراء عمليّةٌ غير صحيحةٍ في الصنف <code>[[Ruby/Fiber|Fiber]]</code>، تحديدًا عند محاولة استدعاء/استئناف ليف ميِّت، أو محاولة التّوليد من الليف الجذر (root fiber)، أو استدعاء ليفٍ عبر خيوطٍ (threads). | |||
===[[Ruby/File|File]]=== | ===[[Ruby/File|File]]=== | ||
===[[Ruby/File::Constants|File::Constants]]=== | ===[[Ruby/File::Constants|File::Constants]]=== |
مراجعة 13:06، 21 نوفمبر 2018
البنية العامة
بنية اللغة
الإسناد
لكي نسند شيئًا في لغة روبي، نستخدم رمز المساواة =
؛ ففي المثال التّالي، يُسنَد العدد 5 إلى المتغيّر v
المحلّي:
v = 5
فالإسناد يُنشئ متغيّرًا محلّيًا جديدًا إذا لم يكن قد عُرِّفَ من قبل.
استدعاء التوابع
عندما تستدعي تابعًا في روبي، فإنّك تمرّر رسالة لكائن معيّن لأجل تنفيذ مهمّة معيّنة، ويتمّ ذلك في روبي كالتّالي:
my_method()
لاحظ أنّ استخدام الأقواس المنحنية هنا اختياريّ:
my_method
المعتمد في هذا التّوثيق أن تُستخدّم الأقواس عند وجود المعامِلات لإزالة الالتباس، إلا في حالة وجود فرق بين وجود الأقواس وحذفها.
هذا القسم يغطّي فقط كيفيّة استدعاء التوابع.
تعابير التحكم
لدى لغة روبي العديد من الطرق للتحكم في مسار تنفيذ البرنامج، وكل البنى المذكورة هنا تعيد قيمةً. بنى التحكم الموجودة في روبي هي:
- بنية
If
الشرطية - تعبير
if
الثلاثي - بنية
unless
- البنيتان
If
وunless
المعدِّلتان - بنية
case
- حلقة
while
التكرارية - حلقة
until
التكرارية - حلقة
for
التكرارية - البنيتان
while
وuntil
المعدِّلتان - القلاب
الاستثناءات
يتمّ التعامل مع الاستثناءات بعد الكلمة rescue
في الكتلة begin/end
:
begin
# الشيفرة التي قد تسبب ظهور استثناء برمجي
rescue
# معالجة الاستثناء
end
إذا كنت ضمن تابع، فلست بحاجة لاستخدام begin
و end
إلا إذا كنت ترغب بحدّ النّطاق الخاص بالاستثناء الذي ترغب بمعالجته:
def my_method
# ...
rescue
# ...
end
نفس الأمر يطبّق في الأصناف (classes) والوحدات (modules).
التعابير البرمجية
تنشئ التعابير البرمجية في لغة روبي كائنات يمكنك استخدامها في برنامجك؛ هذه التعابير تتضمّن:
- القيم المنطقيّة والقيمة
nil
- الأعداد
- السلاسل النصية
- الرموز
- المصفوفات
- جداول Hash
- المجالات
- التعابير النمطية
- بنى Proc
التوابع
تتضمّن التوابع في لغة روبي الوظائف التي يقوم بها برنامجك. إليك هذا المثال لتعريف تابع بسيط:
def one_plus_one
1 + 1
end
تعريف التابع يتكوّن من الكلمة المحجوزة def
يتبعها اسم التابع، ثمّ جسم التابع، فالقيمة المعادة وفي النهاية الكلمة المحجوزة end
. فعند تنفيذ التابع في المثال السابق، ستُعاد القيمة 2. هذا القسم سيغطّي تعريف التّوابع.
الوحدات والأصناف
تخدم الوحدات (Modules) غايتين اثنتين في لغة روبي وهما: ميّزة نطاقات الأسماء (namespace)، والخلط الضمني (mix-in) التي سنوضّحها لاحقًا. أما الأصناف، فهي وحدات إلا أنّها لا يمكن استخدامها للخلط الضمنيّ (mix-in) ضمن وحدات أو أصناف أخرى. ويمكن استخدام الأصناف كالوحدات في حجز نطاق الأسماء، كما يمكن للصنف أن يرث التوابع والثوابت من الأصناف الأكبر.
التحسينات
إن ميّزة الأصناف المفتوحة في لغة روبي تسمح لك بإعادة تعريف أو إضافة وظائف إلى أصناف معرّفة مسبقًا. وهذا ما يسمى بمصطلح "ترقيع القرد" (monkey patch). المشكلة هنا أنَّ تعديلات من هذا النوع تكون مرئيّة على المستوى العام (global)، وبالتالي جميع مستخدمي الصنف المرقّع قادرون على رؤية هذه التغييرات، ممّا قد يسبّب تأثيرات جانبيّة غير محسوبة أو حتى عطب في البرامج.
تأتي التحسينات هنا لتقلّل أثر ترقيع القرد على مستخدمي الصنف الآخرين، إذ تقدّم طريقة لتوسيع الصنف محليًّا.
الأولويات
يوضح هذا القسم أولوية العمليات في روبي من الأعلى إلى الأدنى، إذ تُنفَّذ العمليات ذات الأولوية العليا قبل العمليات ذات الأولوية الأقل منها عند وجودها في نفس التعبير أو السطر البرمجي في الشيفرة.
صيغ متنوعة
يتطرَّق هذا القسم إلى شرح بقية الصيغ والبنى المستعملة في روبي والتي لم تُشمَل في الأقسام السابقة. ستجد فيه شرحًا حول الصيغة المستعملة في إنهاء التعبيرات البرمجية في روبي، وكيفية استعمال المسافات البادئة بالإضافة إلى شرح الكلمات المفتاحية alias
، و undef
، و ?defined
، و BEGIN
، و END
.
الأصناف والوحدات
ARGF
الصنف ARGF
هو مجرى (stream) صُمِّم ليُستخدَم في الملفات البرمجية (scritps) التي تُعالج الملفات المُمرَّرة إليها على شكل وسائط في سطر الأوامر (command-line arguments)، أو المُمرَّرة عبر مجرى الدخل القياسي (STDIN).
ArgumentError
يُطلق الاستثناء ArgumentError
عندما تكون الوسائط (arguments) غير صالحة، ولا يكون هناك صنف Exception
أكثر تحديدًا.
Array
المصفوفات هي مجموعات مُرتَّبة ومُفهرسة بالأعداد الصحيحة (integer-indexed) ومُكونة من أي نوع من الكائنات.
BasicObject
الصنف BasicObject
هو الصنف الأب لجميع الأصناف في روبي، وهو صنف فارغ.
Binding
تُغلِّف كائنات الصنف Binding
سياق التنفيذ (execution context) في مكان معين في الشيفرة البرمجية، وتحتفظ بذلك السياق لاستخدامه مستقبلًا. يُحتفَظ بالمتغيرات، والتوابع، وقيمةself
، وربما كتلة المكرر (iterator block) وكل ما يمكن الوصول إليه في هذا السياق. يمكن إنشاء كائنات الصنف Binding
باستخدام التابع Kernel.binding
، واستدعاؤها بوساطة التابع Kernel.set_trace_func
.
Class
تُعدُّ الأصناف كائناتٍ من الدرجة الأولى (first-class objects) في روبي، وتعدُّ جميعها نُسخٌ من الصنف Class
.
ClosedQueueError
Comparable
يُستخدم المخلوط (mixin) Comparable
من قبل الأصناف التي يمكن ترتيب كائناتها. يجب أن يحدِّد الصنفُ المعاملَ <=>
، الذي يوازن الكائن المستقبِل (receiver) مع كائن آخر ، ويعيد -1، أو 0، أو +1 إن كان المُستقبِل أصغر من الكائن الآخر، أو يساويه، أو أكبر منه على التوالي.
Complex
يمكن تمثيل الأعداد العقدية (تُسمّى أيضًا أعدادًا مركبةً [complex number]) كزوج مكون من عدد حقيقي ووحدة تخلية (العدد i
) وفق الشكل a+bi
، إذ a
هو الجزء الحقيقي، و b
هو الجزء التخيلي و i
هو الوحدة الخيالية.
Complex::compatible
ConditionVariable
توسع كائنات الصنف ConditionVariable
عمل الصنف Mutex
. فمن الممكن باستخدام المتغيرات الشرطية إيقاف مهمة حرجة (critical section) في أثناء تنفيذها إلى حين إتاحة مورد ما.
Continuation
تُولّد الكائنات Continuation
بواسطة التابع Kernel.callcc
بعد استيراد continuation
عبر require
. تحمل هذه الكائنات عنوان العودة (return address) وسياق التنفيذ (execution context)، مما يتيح العودة إلى نهاية الكتلة callcc
من أي مكان في البرنامج.
Data
Dir
كائنات الصنف Dir
هي مجاري مجلدات (directory streams) تمثِّل الجلدات في نظام الملفات الأساسي لنظام التشغيل. فهي توفر طرائق متعددة لعرض المجلدات ومحتوياتها. انظر أيضًا صفحة الصنف File
لمزيد من المعلومات.
ENV
يشبه الصنف ENV
الجداول Hash
كثيرًا ويُستعمل للوصول إلى متغيرات البيئة.
EOFError
يٌطلَق الخطأ EOFError
من طرف بعض عمليات الصنف IO
عندما تصل إلى نهاية الملف.
Encoding
يمثل الصنف Encoding
ترميز المحارف الذي يمكننا استخدامه في لغة روبي.
Encoding::CompatibilityError
يُرمى الاستثناء CompatibilityError
من قبل توابع الصّنفين String
و Encoding
عندما لا يتوافق ترميز المصدر مع ترميز الهدف.
Encoding::Converter
يُستعمَل الصنف Encoding::Converter
في عمليات تحويل الترميز في السلاسل النصية.
Encoding::ConverterNotFoundError
يُرمى الاستثناء ConverterNotFoundError
من قبل توابع تبديل التّرميز (transcoding) عندما لا يتوافق ترميزٌ باسمٍ معيّنٍ مع محوّلٍ (converter) محدَّد.
Encoding::InvalidByteSequenceError
يُرمَى الاستنثناء InvalidByteSequenceError
من قبل توابع الصّنفين String
و Encoding
عندما تحوي السّلسلة النّصية التي يجري تحويل ترميزها بايتًا غير صالح إما للتّرميز المصدر أو التّرميز الهدف المراد التحويل إليه.
Encoding::UndefinedConversionError
يُرمَى الاستثناء UndefinedConversionError
من قبل توابع الصّنفين String
و Encoding
عندما تفشل عملية تبديل التّرميز (transcoding).
EncodingError
يُمثِّل الصنف EncodingError
الصِّنفَ القاعديَّ (base class) لجميعِ أخطاء التّرميز (الصنف Encoding
).
Enumerable
Enumerator
Enumerator::Generator
Enumerator::Lazy
Enumerator::Yielder
Errno
تُنشَأ الوحدة Errno
ديناميكيًّا لتنظيم تفاصيل الأخطاء تُبلِّغ أنظمة عنها وإرسالها إلى أصناف روبي، مع توليد صنف فرعي من الصنف SystemCallError
خاص بكل رقم خطأٍ.
Exception
تُستخدَم الكائنات السليلة من الصنف Exception
للتواصل بين التّابع Kernel.raise
وتصريحات rescue
في الكتل (blocks) من الشكل begin...end
. تَحمل كائنات الصنفException
معلوماتٍ عن الاستثناء المَرمي مثل نوعه (اسم صنف الاستثناء)، وسلسلةً نصيّةً وصفيّةً اختياريّة، ومعلوماتِ تتبّعٍ اختيارية.
FalseClass
القيمة false
العامة (global) هي النسخة الوحيدة من الصنف FalseClass
وتمثِّل قيمة الخطأ (false) في التعابير المنطقية (boolean expressions). يوفر هذا الصنف معاملات تسمح للقيمة false
بالمساهمة بشكل صحيح في التعابير المنطقية.
Fiber
الألياف (Fibers) هي حقولٌ أساسيّةٌ (primitives) تُستخدم في تنفيذ تعدّد المهام التشاركي (cooperative concurrency) للمهام الخفيفة (light weight) أي التي تستهلك جزءًا صغيرًا من الذاكرة.
FiberError
يُرمى الاستثناء FiberError
عند محاولة إجراء عمليّةٌ غير صحيحةٍ في الصنف Fiber
، تحديدًا عند محاولة استدعاء/استئناف ليف ميِّت، أو محاولة التّوليد من الليف الجذر (root fiber)، أو استدعاء ليفٍ عبر خيوطٍ (threads).