الفرق بين المراجعتين لصفحة: «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|التوابع]]===
===[[Ruby/miscellaneous|متفرقات]]===
تتضمّن التوابع في لغة روبي الوظائف التي يقوم بها برنامجك. إليك هذا المثال لتعريف تابع بسيط:<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

المعتمد في هذا التّوثيق أن تُستخدّم الأقواس عند وجود المعامِلات لإزالة الالتباس، إلا في حالة وجود فرق بين وجود الأقواس وحذفها.

هذا القسم يغطّي فقط كيفيّة استدعاء التوابع.

تعابير التحكم

لدى لغة روبي العديد من الطرق للتحكم في مسار تنفيذ البرنامج، وكل البنى المذكورة هنا تعيد قيمةً. بنى التحكم الموجودة في روبي هي:

الاستثناءات

يتمّ التعامل مع الاستثناءات بعد الكلمة rescue في الكتلة begin/end:

begin
 # الشيفرة التي قد تسبب ظهور استثناء برمجي
rescue
 # معالجة الاستثناء
end 

إذا كنت ضمن تابع، فلست بحاجة لاستخدام begin و end إلا إذا كنت ترغب بحدّ النّطاق الخاص بالاستثناء الذي ترغب بمعالجته:

def my_method
 # ...
rescue
 # ...
end

نفس الأمر يطبّق في الأصناف (classes) والوحدات (modules).

التعابير البرمجية

تنشئ التعابير البرمجية في لغة روبي كائنات يمكنك استخدامها في برنامجك؛ هذه التعابير تتضمّن:

التوابع

تتضمّن التوابع في لغة روبي الوظائف التي يقوم بها برنامجك. إليك هذا المثال لتعريف تابع بسيط:

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

ArgumentError

Array

BasicObject

Binding

Class

ClosedQueueError

Comparable

Complex

Complex::compatible

ConditionVariable

Continuation

Data

Dir

ENV

EOFError

Encoding

Encoding::CompatibilityError

Encoding::Converter

Encoding::ConverterNotFoundError

Encoding::InvalidByteSequenceError

Encoding::UndefinedConversionError

EncodingError

Enumerable

Enumerator

Enumerator::Generator

Enumerator::Lazy

Enumerator::Yielder

Errno

Exception

FalseClass

Fiber

FiberError

File

File::Constants

File::Stat

FileTest

Float

FloatDomainError

FrozenError

GC

GC::Profiler

Hash

IO

IO::EAGAINWaitReadable

IO::EAGAINWaitWritable

IO::EINPROGRESSWaitReadable

IO::EINPROGRESSWaitWritable

IO::EWOULDBLOCKWaitReadable

IO::EWOULDBLOCKWaitWritable

IO::WaitReadable

IO::WaitWritable

IOError

IndexError

Integer

Interrupt

Kernel

KeyError

LoadError

LocalJumpError

Marshal

MatchData

Math

Math::DomainError

Method

Module

Mutex

NameError

NilClass

NoMemoryError

NoMethodError

NotImplementedError

Numeric

Object

ObjectSpace

ObjectSpace::WeakMap

Proc

Process

Process::GID

Process::Status

Process::Sys

Process::UID

Process::Waiter

Queue

Random

Random::Formatter

Range

RangeError

Rational

Rational::compatible

Regexp

RegexpError

RubyVM

RubyVM::InstructionSequence

RuntimeError

ScriptError

SecurityError

Signal

SignalException

SizedQueue

StandardError

StopIteration

String

Struct

Symbol

SyntaxError

SystemCallError

SystemExit

SystemStackError

Thread

Thread::Backtrace

Thread::Backtrace::Location

ThreadError

ThreadGroup

Time

TracePoint

TrueClass

TypeError

UnboundMethod

UncaughtThrowError

UnicodeNormalize

Warning

Warning::buffer

ZeroDivisionError

fatal