01 : مقدمة في البرمجة بلغة روبي | Syntax
السلام عليكم ورحمة الله وبركاته
اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا انك انت العلي الحكيم.
ان شاء الله سابدأ في تقديم سلسلة تعليمية للغة روبي Ruby, الدروس ستكون موجهة لمن لديهم خلفية برمجية بأي لغة اخرى.
تعتبر لغة روبي من اللغات كائنية التوجه Object oreinted programming, كما انها تمتاز بكونها very high level language وكلما ارتفعت درجة مستوى اللغة كلما بعدت عن لغة الالة وزادت سهولة كتابتها بالنسبة للبشر.
تمتاز بقابليتها لكتابة نطاق واسع من البرامج فيمكن كتابة تطبيقات ويب او برامج شبكات وديسكتوب او حتى سكربتات تعمل على الterminal , وبالطبع هي متوافقة مع معظم انظمة التشغيل.
لماذا روبي ؟
للرد على هذا السوال ساقتبس كلام مولف اللغة
اقتباسماتسوموتو قال ان لغة برمجة روبي مصممة للإنتاجية وللمرح. وهو يشدد على أن تصميمه اي نظام يحتاج إلى التركيز على احتياجات الإنسان، بدلا من جهاز الكمبيوتر،
«الناس في كثير من الأحيان، ولا سيما مهندسوا الحاسب الآلي، ويكون تركيزهم على جهاز الحاسب الآلي. انهم يعتقدون، "من خلال القيام بذلك، فإن الجهاز سوف يعمل بشكل أسرع. من خلال ذلك، فإن الجهاز يعمل بفعالية أكثر. من خلال ذلك، فإن الجهاز سيكون ويكون ويكون" ولكن في الحقيقة نحن بحاجة إلى التركيز على البشر وعلى كيفية كتابة وفهمنا للبرامج أو تطبيقات تعمل على الجهاز. نحن السادة (البشر). هم العبيد (الجهاز).
ويتضح هذا الامر جليا عندما تبدأ تبرمج بلغة روبي حيث ان عملية البرمجة قد تبدو لك كانك تحادث جهاز الحاسب باللغة الانجليزي (لبساطتها).
بالطبع لغة روبي عندما قدمت لاول مرة(1995) لم تكن ذائعة الصيت حتى تم تصميم اطار العمل الشهير ruby on rails عام 2005 الذي يعتبر كاحد اقوى اطارات العمل المتوفرة.
SYNTAX
لاي لغة برمجية قواعد معينة في كتابة الكود وممارسات معينه يجب ان تتقيد بها, هذه هي الSyntax
هنا رابط لاحد المترجمات التي يمكنك تجربة الكود فيها اونلاين ويمكن استخدامه لتجربة كافة الامثلة المذكورة ادناه.
سيتكون الدرس من:
- التعرف على جمل الطباعة
- التعليقات
- المتغييرات
- نبذة عن المصفوفات
جملة الطباعة
puts "hello world"
كما ترى عزيزي القارئ لا توجد فاصلة منقوطة ";" حيث ان مفسر روبي يعتبر نهاية السطر كانتهاء للامر البرمجي. يمكنك ان تضع الفاصلة المنقوطة والتي بدورها ستقوم باضافة سطر جديد
مثل ,,
puts "hello world"; puts"hello again!"
سيكون الناتج كالاتي
hello world
hello again!
بحيث ان كل جملة ستعرض في سطر جديد, لانه كما اوضحت الفاصلة المنقوطة تفيد انهاء الجملة او الامر البرمجي, لكن اذا قمت باضافة احد رموز عمليات(encounters operators) مثل "+", "-" او "\" حينها سيتنبه مفسر روبي لاستمرارية الامر ولن يقوم ببدء سطر جديد , مثال اذا اردت ان تطبع الجملتين في سطر واحد يمكنك كتابة الكود التالي
puts "hello world " + "hello again!"
والناتج سيكون كالتالي
hello world hello again!
عندما يتعلق الامر بطباعة نص طويل او من اسطر متعددة توجد طريقة امثل واكثر سهولة وسلاسة
Here Document
وتقوم فكرتها على على تحديد terminator باي اسم تريد ويسبقه الرمزان >> بدون مسافات, وبعدها تقوم بكتابة النص متعدد الاسطر الذي تريد وتنهيه بنفس الterminator الذي بداته به
اعتقد ان الفكرة ستوضح اكثر بمثال
print <<welcome
hello world, im using Ruby
this statment was made by here document.
welcome
سينتج الاتي
سيحافظ مفسر روبي على المسافات البيضاء white spaces و التنسيق الذي ادخل به النص.. شبيهة بوسم <pre> الخاص بلغة html. لاحظ المسافة البادئة في السطر الاول عرضت كما هي.
لطباعة نص ما عدة مرات ستقوم بكتابة
-
10.times { puts "hello world" }
الأمرالبرمجي المكتوب سينتج عن طباعة الجملة "hello worlds" عشرة مرات كما هو محدد times.10 بالطبع يمكنك كتابة اي رقم تريد.
اضافة,,
var = "mohamed"
puts "my name is #{var}"
لطباعة قيمة مخزنة باحد المتغييرات داخل string معد مسبقا لابد من كتابته بهذه الطريقة { اسم المتغيير }# والا سيقوم مفسر روبي بقراءة اسم المتغيير كنص عادي.
طريقة كتابة التعليقات | comments
رغم اني لم اكن انوي ذكرها, الا اني ساذكرها لكي ابين كم ان لغة روبي قريبة لفهم الانسان لا الالة
=begin
all comments go here
it supports multible lines
=end
للتعليقات التي تشغل سطر واحد يمكن استخدام الرمز #
المتغييرات | variables
المتغييرات يمكن تعريفها في البرمجة كحاويات نقوم بتخزين معلومات فيها لاسترجاعها فيما بعد.
عندما تقوم بعمل متغييرات او ثوابت هناك قواعد معينة يجب ان لا تتعداها نذكر في روبي ان اللغة تسمح لك باستخدام جميع الاحرف (lowercase & uppercase) وكذلك الرمز " _ "
هناك عدة كلمات معرفة مسبقا محفوظة لاستخدام اللغة reserved words
then |
next |
do |
BEGIN |
true |
nil |
else |
END |
undef |
not |
elseif |
alias |
inless |
or |
end |
and |
until |
redo |
ensure |
begin |
when |
rescue |
false |
break |
while |
retry |
for |
case |
return |
if |
in |
class |
__LINE__ |
__FILE__ |
self |
def |
module |
super |
?defined |
بالطبع بما انها كلمات معرفة مسبقا لا يمكنك تعريف متغيير جديد بها , في البداية ساعطي مثال على احد هذه الكلمات للتوضيح اكثر .
جملة BEGIN
لاحظ ان الاحرف capital letters وتستخدم هذه الجملة لتخزين ما يكتب بداخلها واستدعاءه قبل بدء البرنامج
مثال
print "hello world "
BEGIN {
print "جاري بدء البرنامج \n"
}
النتيجة ستكون
جاري بدء البرنامج
hello world
تعمدت وضع امر طباعة hello world في البداية لكي ابيين ان ما يكتب بداخل مساحة BEGIN سينفذ اولا, بغض النظر عن بداية الكود,بالطبع الامر n\ يكتب لاضفاء سطر جديد كما في لغة C.
من الاشياء الجديرة بالذكر ان روبي تعتبر loosely typed language اي انك لا تحتاج لتحديد نوع المتغيير عند تعريفه (string او integer او غيرها) بل ستتعرف عليها اللغة تلقائياً.
لغة روبي لديها اربعة انواع من المتغييرات :
- Local Variables: المتغييرات المحلية تكون متوفرة فقط داخل الدالة التي تم تعريفها فيها , تبدأ دائما باحرف lowercase او الرمز _ .
- Instance Variables: هذا النوع يكون متوفر بين الدوال والكائنات,, لكن لايمكنك استخدامها في الكلاسات الموروثة inherited من الاصل , اسم المتغيير يسبق بعلامة @ .
- Class Variables: هذا النوع يكون متوفر بين الكائنات المختلفة. وهو ينتمي للكلاس الاصل ويعتبر من خواصه, لكنه ليس متوفر بين الكلاسات المختلفة. يبدأ اسمه ب @@.
- Global Variables : هذا النوع من المتغييرات يكون متوفرا في اي مكان داخل الكود,دائما يسبقها علامة الدولار $
ملاحظة المقصود بتوفر المتغيير يعني قابلية الوصول له, كما نكتب public و private في البرمجة الكائنية التوجه للغات اخرى.
للتوضيح ساعطي امثلة على مفهوم الvariables scope
لنفترض انك قمت بكتابة كود كالاتي
name = "Mohamed"
def myFunc
puts name
end
myFunc
سيقوم مفسر روبي بطباعة الخطا التالي
undefined local variable or method `name' for main:Object
لانه كما ذكرت سابقا المتغييرات المحلية تكون متوفر فقط في الblock الذي تم انشائها فيه
لحل المشكلة فقط نقوم بتعريف المتغيير داخل الدالة ليكونوا في نفس الblock
def myFunc
name = "mohamed"
puts name
end
myFunc
ملاحظة: لانشاء دالة function تقوم بكتابة def في البداية و end لكي تنهي بها الدالة.
*على الرغم من ان لغة روبي متسامحة فيما يتعلق باخطاء الكتابة الا ان نسيانك لكتابة كلمة end في مكانها سيسبب syntax error
انظر للكود التالي جيدا
#انشاء كلاس للأباء
class Parent
#عمل دالة لطباعة اسماء الاباء
def info(name)
@name = name
puts "the father name is #@name"
end
end
#انشاء كلاس جديد للاطفال موروث من كلاس الاباء
class Child < Parent
#عمل دالة مشابهة للاولى الا انها تقوم بعرض اسم الطفل الكامل (سمه واسم والده) م
def info_2 (child_name)
@child_name = child_name
puts "the child name is #@child_name #@name"
end
end
#عمل كائن للكلاس الاول واستدعاء دالة الطباعة
dad1=Parent.new
dad1.info("mohamed")
child=Child.new
child.info_2("omar")
سينتج عن الكود اعلاه الناتج
كما ترى تم طباعة اسم الطفل ناقصا رغم اننا طلبنا من البرنامج ان يطبع اسم الابن والاب في السطر الثاني وهذا يعدو لعدم توفر صلاحية للكلاس الموروث Child للوصول للمتغييرات من نوعinstance variables الخاصة بالكلاس الاصل Parent,
الinstance variable متوفرة لاستخدام الكائنات objects المُنشأة من الكلاس الاصل.
بالطبع يمكنك ان تحل هذه المشكلة بتحويل نوع المتغيير (اسم الاب) لنوع class variables فقط بإضافة العلامتين @@ بدلا من @ .
لنفرض انك قمت بكتابة كود بهذه الطريقة:
$var = "this is a global variable \n"
#انسشاء كلاس جديد
class Class1
#انشاء دالة جديدة
def myFunction
#طباعة المتغيير
print $var
end
end
class Class2
def myFunction
print $var
end
end
#انشاء كائن جديد من الكلاس الاول
object1 = Class1.new
#استدعاء دالة الطباعة للكائن الجديد
object1.myFunction
object2 = Class2.new
object2.myFunction
بالطبع لن يواجه مفسر روبي اي صعوبات لان المتغيير من النوع global variables والذي يمكن استدعاءه من اي مكان في الكود, سواء في الكلاسات المختلفة او الكائنات المشتقة منها
ملاحظة اذا قمنا بانشاء المتغيير داخل الكلاس الاول مثلا سيظل متاحا للكلاس الثاني استخدامه بما انها gloabal variables وهذا هو وجه الفرق بينها وبين ال class variables حيث ان الاخيرة لديها حدود ولا يمكنها الخروج من نطاق الكلاس الذي تم انشاءها فيه (أو الكلاسات الفرعية منه ) لكلاس اخر.
المصفوفات | Arrays
المصفوفات هي عبارة عن متغييرات يمكن ان تقوم بتخزين قيم متعددة فيها.
كتابة مصفوفة في لغة روبي يتم بالشكل الاتي
array = ["mohamed", "ahmed", 10, "ali"]
puts array[1]
سيقوم مفسر روبي حينها بطباعة العنصر رقم 1 من المصفوفة الا وهو ahmed
ملحوظة اسم محمد يعتبر العنصر رقم 0
يمكنك ايضا ان تعمل بطريقة اخرى لطباعة عنصر معين من مصفوفة كالتالي
array = ["mohamed", "ahmed", 10, "ali"]
puts array[-2]
سيقوم البرنامج الان بطباعة القيمة 10, حيث ان علامة ال- تعلم مفسر روبي ان يبدأ بالعد من نهاية المصفوفة ويقوم بالبدأ من القيمة 1 وليس 0
وتظهر فائدة هذه الخاصية عندما يكون لديك مصفوفة طويلة وتريد جلب العنصر الاخير منها,, سيكون منطقيا ان تقوم بالعد من الجهة العكسية
وصل الله وسلم على سيدنا محمد وعلى اله وصحبه اجمعين,,
ارجو ان اكون قد وفقت في شرح الدرس
التعليقات (0)
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !