كيفية استخدام IRB لاستكشاف Ruby


thaer mohamad

مقدمة

كلمة IRB هي اختصار (Ruby التفاعلية)، وهي الأداة التي تمكن من استكشاف لغة البرمجة Ruby واختبار كودها البرمجي دون الحاجة لإنشاء ملف، حيث يتم كتابة كود Ruby ضمن موجه الأوامر الخاص بهذه الأداة لتقوم هي بمعالجة هذا الكود وإظهار النتائج. تسمح الأداة IRB باستخدام جميع الدوال الضمنية بالإضافة للمكتبات والحزم البرمجية gems المنصبة، كما تتيح هذه الأداة حفظ الأوامر السابقة وحتى الإكمال التلقائي للكود البرمجي.

تشغيل وإنهاء الأداة IRB

في البداية يجب أن تكون لغة Ruby منصبة على الحاسب عندها يتم تشغيل الأداة عن طريق موجه أوامر النظام بإدخال الأمر التالي:

$ irb

فيظهر موجه أوامر الأداة IRB كما يلي:

IRB session
irb(main):001:0>

حيث يدل موجه الأوامر على أنه تم تشغيل الأداة IRB وفق سياق المستوى الأعلى main، أي أن الأوامر التي سيتم إدخالها ستنفّذ ضمن سياق المستوى الأعلى الافتراضي للغة Ruby، كما تظهر أرقام الأسطر.
ملاحظة: في حال تم تنصيب Ruby مع RVM فإنه لن يظهر اسم الأداة IRB في موجه الأوامر، ويظهر عوضًا عنه رقم الإصدار:

IRB session from RVM
2.4.0 :001 >

لكن يمكن إظهار اسم الأداة IRB في موجه الأوامر من جديد بتنفيذ الأمر:

irb --prompt inf-ruby 

يتم كتابة كود Ruby ضمن موجه أوامر الأداة IRB وفق نفس قواعد برمجة لغة Ruby. جرب الأداة IRB بكتابة كود جمع عددين:

irb(main):001:0> 2 + 2

ثم اضغط مفتاح الإدخال ENTER من لوحة المفاتيح فتظهر النتيجة التالي:

IRB session
=> 4

حيث يدل الرمز <= على نتيجة تنفيذ كود Ruby. يتم إنهاء الأداة IRB عن طريق كتابة exit في موجه الأوامر ثم ضغط المفتاح ENTER أو بالضغط على CTRL+D من لوحة المفاتيح, فيتم الرجوع إلى موجه أوامر النظام.

تنفيذ الكود ضمن جلسة IRB

تؤمن الأداة IRB طريقة فعالة لتجربة كود Ruby والتأكد من أنه ملائم لحل المشكلة البرمجية، حيث تظهر نتيجة تنفيذ أي كود مكتوب بلغة Ruby ضمن شاشة موجه أوامر الأداة IRB. فمثلا عند تنفيذ الكود التالي:

irb(main):001:0> puts "Hello World"

تظهر النتيجة عند الضغط على مفتاح الإدخال ENTER:

Hello World
=> nil

وهي عبارة عن نتيجة تنفيذ الدالة puts والتي تقوم بطابعة السلسلة النصية المدخلة مع إضافة سطر جديد على جهاز الإخراج القياسي (شاشة الحاسب). تقوم جميع دوال لغة Ruby بإرجاع قيمة ما حسب وظيفة الدالة ومدخلاتها، حيث يمكن أن تكون القيمة المرجعة nil أي لاشيء كما هو الحال مع الدالة puts. بعد الانتهاء من تنفيذ العبارة البرمجية يظهر موجه أوامر IRB من جديد ويزداد رقم الأسطر بمقدار واحد:

irb(main):001:0> puts "Hello World"
Hello World
=> nil
irb(main):002:0>

يفيد تغير رقم سطر موجه الأوامر بعد كل عملية إدخال عبارة برمجية في تسهيل تعقب وتصحيح الأخطاء البرمجية في البرامج الكبيرة، ففي حال حدوث خطأ ما في أي عبارة برمجية يظهر رقم السطر ضمن رسالة الخطأ للدلالة على مكان حدوث الخطأ. يسمح موجه أوامر IRB بإسناد القيم للمتغيرات بنفس طريقة الإسناد المستخدمة في برامج Ruby الاعتيادية، فمن أجل إسناد القيمة 1868 للمتغير birth_year نكتب العبارة البرمجية:

irb(main):002:0> birth_year = 1868

وعند الضغط على مفتاح الإدخال ENTER تظهر القيمة المسندة كنتيجة لتنفيذ عملية الإسناد:

IRB session
=> 1868

والآن سنقوم بإنشاء متغير ثاني death_year ونسند له القيمة 1921 كما يلي:

irb(main):003:0> death_year = 1921

يمكن الآن إنشاء متغير جديد age_at_death يحتوي على ناتج طرح المتغيرين السابقين من بعضهما:

irb(main):004:0> age_at_death = death_year - birth_year

وعند الضغط على مفتاح الإدخال ENTER تظهر القيمة المسندة للمتغير age_at_death:

IRB session
=> 53

بما أن كل قيمة يتم إسنادها لمتغير تظهر بشكل تلقائي على شاشة موجه أوامر IRB بالتالي لا داعي لاستخدام دوال الطباعة puts أو print لتنفيذ ذلك. يسمح موجه أوامر IRB بكتابة العبارات البرمجية الطويلة على عدة أسطر، حيث لا تنفذ العبارات البرمجية ما لم تكن مكتملة من حيث الصيغة البرمجية، فمثلا سنقوم بإدخال عبارة برمجية تتضمن مصفوفة من أسماء سمك القرش ودالة الاختيار select التي تقوم بإرجاع أسماء سمك القرش المتضمنة فقط على الحرف "a":

["Tiger", "Great White", "Angel"].select do |shark|
   shark.include?("a")
end

يتم إدخال هذه العبارة البرمجية على شكل أسطر ضمن موجه أوامر IRB، ولا يتم تنفيذ هذه العبارة إلا بعد الانتهاء من إدخال السطر الثالث وضغط مفتاح الإدخال ENTER، هذا ويظهر الرمز "*" أمام السطر بعض ضغط مفتاح الإدخال ENTER في حال عدم اكتمال العبارة البرمجية:

IRB session
irb(main):005:0> ["Tiger", "Great White", "Angel"].select do |shark|
irb(main):006:1*    shark.include?("a")
irb(main):007:1> end

بما أن العبارة البرمجية السابقة تحوي الكلمة الدالة do فإن موجه أوامر IRB لن ينفذ العبارة حتى إدخال الكلمة الدالة end عندها فقط تظهر نتيجة التنفيذ كما يلي:

IRB session
=> ["Great White"]

وهكذا تسمح الأداة IRB في اختبار الكود البرمجي المكتوب بلغة Ruby قبل استخدامه في البرنامج أو من أجل اختبار المكتبات البرمجية الخارجية.

استخدام المكتبات والحزم البرمجية

يمكن استيراد المكتبات الخارجية المكتوبة بلغة Ruby أثناء جلسة IRB باستخدام الكلمة الدالة require كما هو الحال عند كتابة برنامج Ruby الاعتيادي، حيث يمكن أن تتضمن هذه المكتبات على مكتبات Ruby القياسية أو أكود المكتوبة بشكل شخصي أو حتى حزم Ruby البرمجية والمسماة gems والتي يتم إصدارها من خلال الموقع Rubygems.org ويتم تنصيبها باستخدام الأمر gem. تحوي مكتبات Ruby القياسية على النماذج التي تسمح بتأمين طلبات الويب والحصول على نتائج الاستجابة لهذه الطلبات، ويمكن استخدمها ضمن جلسة IRB بنفس طريقة استخدامها في برامج Ruby الاعتيادية. فمن أجل استيراد Net/HTTP من مكتبة Ruby القياسية يتم كتابة العبارة البرمجية التالية ضمن موجه أوامر IRB:

require 'net/http'

ثم ضغط المفتاح ENTER فتكون نتيجة التنفيذ true عند نجاح عملية تحميل هذه المكتبة. والآن سنقوم بكتابة الكود الذي يقوم بإرسال طلب إلى الموقع icanhazip.com من أجل الحصول على عنوان IP الخارجي:

uri = URI.parse("http://icanhazip.com")
response = Net::HTTP.get_response uri
response.body

عند الانتهاء من إدخال كل سطر ضمن موجه أوامر IRB تظهر نتيجة التنفيذ في السطر الذي يليه وهذا ما يمكننا من التحقق من نجاح عملية تنفيذ الكود البرمجي الموجود في هذا السطر:

IRB session
irb(main):010:0> uri = URI.parse("http://icanhazip.com")
=> #<URI::HTTP http://icanhazip.com>
irb(main):011:0> response = Net::HTTP.get_response uri
=> #<Net::HTTPOK 200 OK readbody=true>
irb(main):012:0> response.body
=> 203.0.113.52\n

في حال عدم وجود المكتبة المطلوبة سوف تظهر نتيجة مختلفة عمّ سبق للدلالة على فشل عملية استيراد هذه المكتبة, ففي حال أردنا استيراد المكتبة HTTParty المستخدمة لتسهيل طلبات HTTP :

require 'httparty'

سوف تظهر النتيجة التالية:

IRB session
LoadError: cannot load such file  httparty

والتي تخبرنا أنا هذه المكتبة غير متوفرة, لأنه تم إصدار هذه المكتبة على شكل حزمة برمجية، لذا علينا تنصيبها. تتم عملية تنصيب هذه الحزمة البرمجية بإنهاء موجه أوامر IRB بالضغط على المفاتيح CTRL+D من أجل الانتقال إلى موجه أوامر النظام ثم يتم تنفيذ الأمر gem لتنصيب الحزمة httparty كما يلي:

$ gem install httparty

ثم يتم تنفيذ الأمر irb للرجوع إلى موجه أوامر IRB كما يلي:

$ irb

ثم نعيد محاولة تنصيب المكتبة httparty من جديد كما يلي:

require 'httparty’

فتكون نتيجة تنفيذ هذا الكود true دلالة على نجاح عملية تحميل هذه المكتبة، والآن نقوم باختبار عمل هذه المكتبة بإدخال الكود التالي في موجه أوامر IRB:

response = HTTParty.get("http://icanhazip.com")
response.body

فتكون نتيجة تنفيذ هذا الكود:

IRB session
=> 203.0.113.52\n

والآن سنقوم باستكشاف طريقة اختبار كود Ruby ضمن الأداة IRB.

تحميل كود Ruby في IRB

يمكن تحديد المكتبات والحزم المراد تحملها عند تشغيل الأداة IRB عن طريق إضافة الخيار -r متبوعاً باسم المكتبة المراد تحميلها, فمثلا لتحميل المكتبة httparty عند تشغيل IRB نكتب الأمر irb -r httparty في موجه أوامر النظام وبالتالي لن نحتاج تنفيذ الكود require httparty. كما يمكن استخدام هذه الطريقة لتحميل كود Ruby الذي تم كتبته سابقا وتخذينه في ملف من أجل اختباره بالأداة IRB. لنقم بإنشاء ملف Ruby جديد اسمه ip_grabber.rb يحتوي على كود الغرض IPGrabber المتضمن عل الدالة get التي تقوم بإرجاع عنوان IP الخارجي للحاسب عند تزويدها بالعنوان الإلكترون URL للموقع icanhazip.com، حيث تم الاعتماد على المكتبة HTTParty من أجل طلب عنوان IP الخارجي للحاسب من الموقع icanhazip.com:

require 'httparty'
class IPGrabber

  def initialize()
    @url = "http://icanhazip.com"
  end

  def get
    response = HTTParty.get(@url)
    response.body.chomp  # remove the \n if it exists
  end
end

يفيد إنشاء الغرض IPGrabber في عدم الحاجة لتغيير كود برنامج Ruby الخاص بنا عند الحاجة لإضافة ميزة الحصول على عنوان IP. والآن سنقوم بتحميل هذا الملف عند تشغيل الأداة IRB عن طريق إضافة مسار الملف بعد الخيار r- حيث تم استخدام المسار لأنه ملف محلي وليس مكتبة أو حزمة كما لا داعي لوضع امتداد الملف rb.:

$ irb -r ./ip_grabber

والآن أصبح بالإمكان إنشاء غرض جديد من الصف IPGrabber ضمن جلسة IRB كما يلي:

ip = IPGrabber.new
ip.get

فتكون نتيجة تنفيذ هذا الكود كما يلي:

IRB session
=> 203.0.113.52

وهكذا نجد أن تحميل كودنا الخاص ضمن جلسة IRB يسمح لنا بالتعامل مع مكتباتنا الخاصة قبل إضافتها لبرنامجنا النهائي. والآن بعد أن تعلمنا كيفية كتابة الكود في الأداة IRB سنقوم بتعلم طريقة ضبط الأداة IRB.

ضبط IRB

يمكن ضبط جلسة IRB عن طريق إنشاء ملف ضبط بامتداد irbrc. والذي يمكن عن طريقه إضافة وتعديل ميزة الإكمال التلقائي والتدرج وحفظ الأوامر. يتم إنشاء ملف ضبط IRB ضمن مجلد المستخدم كما يلي:

$ nano ~/.irbrc
require 'irb/completion'

والآن سنقوم بإضافة ميزة حفظ الأوامر المنفذة في موجه أوامر IRB في ملف خارجي وذلك بإضافة السطر التالي إلى ملف الضبط:

IRB.conf[:SAVE_HISTORY] = 1000

تم في هذا الكود تمكين عملية حفظ آخر ألف عبارة برمجية تم إدخالها في موجه أوامر IRB ضمن الملف irb_history حيث يمكن تصفحها من خلال مفاتيح الأسهم العلوي والسفلي على لوحة المفاتيح, وعند الرغبة في تغيير اسم ملف الحفظ يتم إضافة السطر التالي لملف الضبط:

IRB.conf[:HISTORY_FILE] = '~/your_history_filename'

والآن سنضيف ميزة التدرج الآلي للكود البرمجي والتي تفيد عند برمجة الصفوف والدوال والكتل البرمجية وذلك بإضافة السطر التالي إلى ملف الضبط:

IRB.conf[:AUTO_INDENT] = true

كما يمكن أن يتضمن ملف الضبط أي كود Ruby مثل تعريف الدوال المساعدة أو استخدام require لتحميل مكتبات إضافية، فمثلا لإضافة الدالة المساعد history إلى موجه أوامر IRB والتي تقوم بإظهار العبارات البرمجية, يتم إضافة الكود التالي إلى ملف الضبط:

def history
  history_array = Readline::HISTORY.to_a
  print history_array.join("\n")
end

والآن أصبح بالإمكان إظهار العبارات البرمجية المحفوظة بتنفيذ الأمر history في موجه أوامر IRB فتظهر جميع العبارات البرمجية المحفوظة، لكن عند الرغبة في تحديد عدد النتائج المراد إظهارها يجب تعديل الكود السابق بإضافة الخيار count الذي يتم من خلاله تحديد عدد النتائج، لذا يجب تعديل الكود السابق ليصبح كما يلي:

# history command
def history(count = 0)

  # Get history into an array
  history_array = Readline::HISTORY.to_a

  # if count is > 0 we'll use it.
  # otherwise set it to 0
  count = count > 0 ? count : 0

  if count > 0
    from = hist.length - count
    history_array = history_array[from..-1] 
  end

  print history_array.join("\n")
end

نحفظ ملف الضبط ثم نبدأ جلسة IRB جديد ثم ندخل الأمر history 2 فتظهر أخر عبارتين برمجيتين تم إدخالهما في موجه أوامر IRB. إن استخدام ملف الضبط لتحميل المكتبات البرمجية سيزيد من زمن بدء تشغيل الأداة IRB وبالتالي يفضل تحميل المكتبات عن طريق استخدام الأمر require.

ملخص

تعد الأداة مكان جيد لاختبار كود Ruby وبالتالي تؤمن طريقة عظيمة لاختبار البرنامج المكتوبة بلغة Ruby قبل حفظها ضمن الملف.

ترجمة المقال How To Use IRB to Explore Rub لصاحبه Brian Hogan





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن