01 : مقدمة في البرمجة بلغة روبي | Syntax

Mephistophelesمنذ 8 سنوات

السلام عليكم ورحمة الله وبركاته

اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا انك انت العلي الحكيم.

ان شاء الله سابدأ في تقديم سلسلة تعليمية للغة روبي Ruby, الدروس ستكون موجهة لمن لديهم خلفية برمجية بأي لغة اخرى.

تعتبر لغة روبي من اللغات كائنية التوجه Object oreinted programming, كما انها تمتاز بكونها very high level language   وكلما ارتفعت درجة مستوى اللغة كلما بعدت عن لغة الالة وزادت سهولة كتابتها بالنسبة للبشر.

تمتاز بقابليتها لكتابة نطاق واسع من البرامج فيمكن كتابة تطبيقات ويب او برامج شبكات وديسكتوب او حتى سكربتات تعمل على الterminal , وبالطبع هي متوافقة مع معظم انظمة التشغيل.

 

لماذا روبي ؟

للرد على هذا السوال ساقتبس كلام مولف اللغة 

اقتباس

ماتسوموتو قال ان لغة برمجة روبي مصممة للإنتاجية وللمرح. وهو يشدد على أن تصميمه اي نظام يحتاج إلى التركيز على احتياجات الإنسان، بدلا من جهاز الكمبيوتر،

«الناس في كثير من الأحيان، ولا سيما مهندسوا الحاسب الآلي، ويكون تركيزهم على جهاز الحاسب الآلي. انهم يعتقدون، "من خلال القيام بذلك، فإن الجهاز سوف يعمل بشكل أسرع. من خلال ذلك، فإن الجهاز يعمل بفعالية أكثر. من خلال ذلك، فإن الجهاز سيكون ويكون ويكون" ولكن في الحقيقة نحن بحاجة إلى التركيز على البشر وعلى كيفية كتابة وفهمنا للبرامج أو تطبيقات تعمل على الجهاز. نحن السادة (البشر). هم العبيد (الجهاز).

ويتضح هذا الامر جليا عندما تبدأ تبرمج بلغة روبي حيث ان عملية البرمجة قد تبدو لك كانك تحادث جهاز الحاسب باللغة الانجليزي (لبساطتها).

بالطبع لغة روبي عندما قدمت لاول مرة(1995)  لم تكن ذائعة الصيت حتى تم تصميم اطار العمل الشهير ruby on rails عام 2005 الذي يعتبر كاحد اقوى اطارات العمل المتوفرة.

 

SYNTAX

لاي لغة برمجية قواعد معينة في كتابة الكود وممارسات معينه يجب ان تتقيد بها, هذه هي الSyntax 

 هنا رابط لاحد المترجمات التي يمكنك تجربة الكود فيها اونلاين ويمكن استخدامه لتجربة كافة الامثلة المذكورة ادناه.

سيتكون الدرس من:

  1. التعرف على جمل الطباعة
  2. التعليقات
  3. المتغييرات
  4. نبذة عن المصفوفات

 

جملة الطباعة 


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

سينتج الاتي 

q34567890-.png

سيحافظ مفسر روبي على المسافات البيضاء 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 

980493280438290.jpg

 

Local Variables

لنفترض انك قمت بكتابة كود كالاتي


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 

 

instance variables

انظر للكود التالي جيدا 


#انشاء كلاس للأباء 
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")

سينتج عن الكود اعلاه الناتج 

omer mohameed.png

 

كما ترى تم طباعة اسم الطفل ناقصا رغم اننا طلبنا من البرنامج ان يطبع اسم الابن والاب في السطر الثاني  وهذا يعدو لعدم توفر صلاحية للكلاس الموروث Child للوصول للمتغييرات من نوعinstance variables الخاصة بالكلاس الاصل Parent,

 الinstance variable متوفرة لاستخدام الكائنات objects المُنشأة من الكلاس الاصل.

بالطبع يمكنك ان تحل هذه المشكلة بتحويل نوع المتغيير (اسم الاب) لنوع class variables فقط بإضافة العلامتين @@ بدلا من @ . 

 

Global 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

888888.png

وتظهر فائدة هذه الخاصية عندما يكون لديك مصفوفة طويلة وتريد جلب العنصر الاخير منها,, سيكون منطقيا ان تقوم بالعد من الجهة العكسية

 

وصل الله وسلم على سيدنا محمد وعلى اله وصحبه اجمعين,,

ارجو ان اكون قد وفقت في شرح الدرس

كلمات دليلية:
0
إعجاب
8615
مشاهدات
0
مشاركة
0
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !