الفرق بين المراجعتين لصفحة: «Ruby/Topics»
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) إضافة شرح للأقسام. |
||
سطر 1: | سطر 1: | ||
== البنية العامة == | ==البنية العامة== | ||
===[[Ruby/syntax|بنية اللغة]]=== | ===[[Ruby/syntax|بنية اللغة]]=== | ||
===[[Ruby/assignment|الإسناد]]=== | ===[[Ruby/assignment|الإسناد]]=== | ||
لكي نسند شيئًا في لغة روبي، نستخدم رمز المساواة <code>=</code>؛ ففي المثال التّالي، يُسنَد العدد 5 إلى المتغيّر <code>v</code> المحلّي:<syntaxhighlight lang="ruby"> | |||
v = 5 | |||
</syntaxhighlight>فالإسناد يُنشئ متغيّرًا محلّيًا جديدًا إذا لم يكن قد عُرِّفَ من قبل. | |||
===[[Ruby/calling methods|استدعاء التوابع]]=== | ===[[Ruby/calling methods|استدعاء التوابع]]=== | ||
عندما تستدعي تابعًا في روبي، فإنّك تمرّر رسالة لكائن معيّن لأجل تنفيذ مهمّة معيّنة، ويتمّ ذلك في روبي كالتّالي:<syntaxhighlight lang="ruby"> | |||
my_method() | |||
</syntaxhighlight>لاحظ أنّ استخدام الأقواس المنحنية هنا اختياريّ:<syntaxhighlight lang="ruby"> | |||
my_method | |||
</syntaxhighlight>المعتمد في هذا التّوثيق أن تُستخدّم الأقواس عند وجود المعامِلات لإزالة الالتباس، إلا في حالة وجود فرق بين وجود الأقواس وحذفها. | |||
هذا القسم يغطّي فقط كيفيّة استدعاء التوابع. | |||
===[[Ruby/control expressions|تعابير التحكم]]=== | ===[[Ruby/control expressions|تعابير التحكم]]=== | ||
لدى لغة روبي العديد من الطرق للتحكم في مسار تنفيذ البرنامج، وكل البنى المذكورة هنا تعيد قيمةً. بنى التحكم الموجودة في روبي هي: | |||
* [[Ruby/control expressions#.D8.A8.D9.86.D9.8A.D8.A9 If .D8.A7.D9.84.D8.B4.D8.B1.D8.B7.D9.8A.D8.A9|بنية <code>If</code> الشرطية]] | |||
* [[Ruby/control expressions#.D8.AA.D8.B9.D8.A8.D9.8A.D8.B1 if .D8.A7.D9.84.D8.AB.D9.84.D8.A7.D8.AB.D9.8A|تعبير <code>if</code> الثلاثي]] | |||
* [[Ruby/control expressions#.D8.A8.D9.86.D9.8A.D8.A9 unless|بنية <code>unless</code>]] | |||
* [[Ruby/control expressions#.D8.A7.D9.84.D8.A8.D9.86.D9.8A.D8.AA.D8.A7.D9.86 If .D9.88 unless .D8.A7.D9.84.D9.85.D8.B9.D8.AF.D9.90.D9.91.D9.84.D8.AA.D8.A7.D9.86.C2.A0|البنيتان <code>If</code> و <code>unless</code> المعدِّلتان]] | |||
* [[Ruby/control expressions#.D8.A8.D9.86.D9.8A.D8.A9 case.C2.A0|بنية <code>case</code>]] | |||
* [[Ruby/control expressions#.D8.AD.D9.84.D9.82.D8.A9 while .D8.A7.D9.84.D8.AA.D9.83.D8.B1.D8.A7.D8.B1.D9.8A.D8.A9|حلقة <code>while</code> التكرارية]] | |||
* [[Ruby/control expressions#.D8.AD.D9.84.D9.82.D8.A9 until .D8.A7.D9.84.D8.AA.D9.83.D8.B1.D8.A7.D8.B1.D9.8A.D8.A9|حلقة <code>until</code> التكرارية]] | |||
* [[Ruby/control expressions#.D8.AD.D9.84.D9.82.D8.A9 for .D8.A7.D9.84.D8.AA.D9.83.D8.B1.D8.A7.D8.B1.D9.8A.D8.A9|حلقة <code>for</code> التكرارية]] | |||
* [[Ruby/control expressions#.D8.A7.D9.84.D8.A8.D9.86.D9.8A.D8.AA.D8.A7.D9.86 while .D9.88 until .D8.A7.D9.84.D9.85.D8.B9.D8.AF.D9.90.D9.91.D9.84.D8.AA.D8.A7.D9.86|البنيتان <code>while</code> و <code>until</code> المعدِّلتان]] | |||
* [[Ruby/control expressions#.D8.A7.D9.84.D9.82.D9.84.D8.A7.D8.A8|القلاب]] | |||
===[[Ruby/exceptions|الاستثناءات]]=== | ===[[Ruby/exceptions|الاستثناءات]]=== | ||
يتمّ التعامل مع الاستثناءات بعد الكلمة <code>rescue</code> في الكتلة <code>[[Ruby/miscellaneous#BEGIN .D9.88 END|begin/end]]</code>:<syntaxhighlight lang="ruby"> | |||
begin | |||
# الشيفرة التي قد تسبب ظهور استثناء برمجي | |||
rescue | |||
# معالجة الاستثناء | |||
end | |||
</syntaxhighlight>إذا كنت ضمن تابع، فلست بحاجة لاستخدام <code>[[Ruby/miscellaneous#BEGIN .D9.88 END|begin]]</code> و <code>[[Ruby/miscellaneous#BEGIN .D9.88 END|end]]</code> إلا إذا كنت ترغب بحدّ النّطاق الخاص بالاستثناء الذي ترغب بمعالجته:<syntaxhighlight lang="ruby"> | |||
def my_method | |||
# ... | |||
rescue | |||
# ... | |||
end | |||
</syntaxhighlight><span> </span>نفس الأمر يطبّق في [[:تصنيف:Ruby Class|الأصناف]] (classes) و<nowiki/>[[:تصنيف:Ruby Module|الوحدات]] (modules). | |||
===[[Ruby/literals|التعابير البرمجية]]=== | ===[[Ruby/literals|التعابير البرمجية]]=== | ||
تنشئ التعابير البرمجية في لغة روبي كائنات يمكنك استخدامها في برنامجك؛ هذه التعابير تتضمّن: | |||
* [[Ruby/literals#.D8.A7.D9.84.D9.82.D9.8A.D9.85 .D8.A7.D9.84.D9.85.D9.86.D8.B7.D9.82.D9.8A.D9.91.D8.A9 .D9.88 .D8.A7.D9.84.D9.82.D9.8A.D9.85.D8.A9 nil|القيم المنطقيّة والقيمة <code>nil</code>]] | |||
* [[Ruby/literals#.D8.A7.D9.84.D8.A3.D8.B9.D8.AF.D8.A7.D8.AF|الأعداد]] | |||
* [[Ruby/literals#.D8.A7.D9.84.D8.B3.D9.84.D8.A7.D8.B3.D9.84 .D8.A7.D9.84.D9.86.D8.B5.D9.8A.D8.A9|السلاسل النصية]] | |||
* [[Ruby/literals#.D8.A7.D9.84.D8.B1.D9.85.D9.88.D8.B2|الرموز]] | |||
* [[Ruby/literals#.D8.A7.D9.84.D9.85.D8.B5.D9.81.D9.88.D9.81.D8.A7.D8.AA|المصفوفات]] | |||
* [[Ruby/literals#.D8.A7.D9.84.D8.AC.D8.AF.D9.88.D8.A7.D9.84 Hash|جداول Hash]] | |||
* [[Ruby/literals#.D8.A7.D9.84.D9.85.D8.AC.D8.A7.D9.84.D8.A7.D8.AA|المجالات]] | |||
* [[Ruby/Regexp|التعابير النمطية]] | |||
* [[Ruby/literals#.D8.A8.D9.86.D9.8A.D8.A9 Proc|بنى Proc]] | |||
===[[Ruby/methods|التوابع]]=== | ===[[Ruby/methods|التوابع]]=== | ||
= | تتضمّن التوابع في لغة روبي الوظائف التي يقوم بها برنامجك. إليك هذا المثال لتعريف تابع بسيط:<syntaxhighlight lang="ruby"> | ||
def one_plus_one | |||
1 + 1 | |||
end | |||
</syntaxhighlight>تعريف التابع يتكوّن من الكلمة المحجوزة <code>def</code> يتبعها اسم التابع، ثمّ جسم التابع، فالقيمة المعادة وفي النهاية الكلمة المحجوزة <code>[[Ruby/miscellaneous#BEGIN .D9.88 END|end]]</code>. فعند تنفيذ التابع في المثال السابق، ستُعاد القيمة 2. هذا القسم سيغطّي تعريف التّوابع. | |||
===[[Ruby/modules and classes|الوحدات والأصناف]]=== | ===[[Ruby/modules and classes|الوحدات والأصناف]]=== | ||
تخدم [[Ruby/modules and classes#.D8.A7.D9.84.D9.88.D8.AD.D8.AF.D8.A7.D8.AA|الوحدات]] (Modules) غايتين اثنتين في لغة روبي وهما: ميّزة نطاقات الأسماء (namespace)، والخلط الضمني (mix-in) التي سنوضّحها لاحقًا. أما [[Ruby/modules and classes#.D8.A7.D9.84.D8.A3.D8.B5.D9.86.D8.A7.D9.81|الأصناف]]، فهي وحدات إلا أنّها لا يمكن استخدامها للخلط الضمنيّ (mix-in) ضمن وحدات أو أصناف أخرى. ويمكن استخدام الأصناف كالوحدات في حجز نطاق الأسماء، كما يمكن للصنف أن يرث التوابع والثوابت من الأصناف الأكبر. | |||
===[[Ruby/precedence|الأولويات]]=== | ===[[Ruby/precedence|الأولويات]]=== | ||
===[[Ruby/refinements|التحسينات]]=== | ===[[Ruby/refinements|التحسينات]]=== | ||
إن ميّزة الأصناف المفتوحة في لغة روبي تسمح لك بإعادة تعريف أو إضافة وظائف إلى أصناف معرّفة مسبقًا. وهذا ما يسمى بمصطلح "ترقيع القرد" (monkey patch). المشكلة هنا أنَّ تعديلات من هذا النوع تكون مرئيّة على المستوى العام (global)، وبالتالي جميع مستخدمي الصنف المرقّع قادرون على رؤية هذه التغييرات، ممّا قد يسبّب تأثيرات جانبيّة غير محسوبة أو حتى عطب في البرامج. | |||
تأتي التحسينات هنا لتقلّل أثر ترقيع القرد على مستخدمي الصنف الآخرين، إذ تقدّم طريقة لتوسيع الصنف محليًّا. | |||
== | === [[Ruby/miscellaneous|صيغ متنوعة]] === | ||
يتطرَّق هذا القسم إلى شرح بقية الصيغ والبنى المستعملة في روبي والتي لم تُشمَل في الأقسام السابقة. ستجد فيه شرحًا حول الصيغة المستعملة في [[Ruby/miscellaneous#.D8.A5.D9.86.D9.87.D8.A7.D8.A1 .D8.AA.D8.B9.D8.A8.D9.8A.D8.B1 .D8.A8.D8.B1.D9.85.D8.AC.D9.8A|إنهاء التعبيرات البرمجية]] في روبي، وكيفية استعمال [[Ruby/miscellaneous#.D8.A7.D9.84.D9.85.D8.B3.D8.A7.D9.81.D8.A7.D8.AA .D8.A7.D9.84.D8.A8.D8.A7.D8.AF.D8.A6.D8.A9|المسافات البادئة]] بالإضافة إلى شرح الكلمات المفتاحية <code>[[Ruby/miscellaneous#.D8.A7.D9.84.D9.83.D9.84.D9.85.D8.A9 .D8.A7.D9.84.D9.85.D9.81.D8.AA.D8.A7.D8.AD.D9.8A.D8.A9 alias|alias]]</code>، و <code>[[Ruby/miscellaneous#.D8.A7.D9.84.D9.83.D9.84.D9.85.D8.A9 .D8.A7.D9.84.D9.85.D9.81.D8.AA.D8.A7.D8.AD.D9.8A.D8.A9 undef|undef]]</code>، و <code>[[Ruby/miscellaneous#.D8.A7.D9.84.D9.83.D9.84.D9.85.D8.A9 .D8.A7.D9.84.D9.85.D9.81.D8.AA.D8.A7.D8.AD.D9.8A.D8.A9 .3Fdefined|?defined]]</code>، و <code>[[Ruby/miscellaneous#BEGIN .D9.88 END|BEGIN]]</code>، و <code>[[Ruby/miscellaneous#BEGIN .D9.88 END|END]]</code>. | |||
==الأصناف والوحدات== | |||
===[[Ruby/ARGF|ARGF]]=== | ===[[Ruby/ARGF|ARGF]]=== | ||
===[[Ruby/ArgumentError|ArgumentError]]=== | ===[[Ruby/ArgumentError|ArgumentError]]=== |
مراجعة 08:39، 19 نوفمبر 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
.