<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x644;&#x63A;&#x629; &#x631;&#x648;&#x628;&#x64A; Ruby</title><link>https://academy.hsoub.com/programming/ruby/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x644;&#x63A;&#x629; &#x631;&#x648;&#x628;&#x64A; Ruby</description><language>ar</language><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x644;&#x63A;&#x629; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_11/---.png.7faf97620588b844f6b5630ae7710ab5.png" /></p>
<p>
	نعرفك في هذا المقال على لغة روبي Ruby إحدى أشهر لغات البرمجة المستخدمة اليوم. كما نعرفك على أبرز مميزاتها، وطريقة كتابة شيفراتها البرمجية، وأهم خطوات تعلمها، ونختم المقال بأهم المصادر العربية لتعلم روبي والتي تؤهلك للانطلاق في عالم البرمجة وتطوير الويب.
</p>

<h2 id="ruby">
	ما هي لغة Ruby
</h2>

<p>
	لغة روبي Ruby هي لغة برمجة عالية المستوى ومفتوحة المصدر طورها مهندس البرمجيات الياباني Matsumoto Yukihiro عام 1993 بهدف إيجاد لغة سهلة القراءة والكتابة وقوية بنفس الوقت يمكنها أن تجعل من كتابة الشيفرات البرمجية أمرًا ممتعًا وسريعًا.
</p>

<p>
	تحتاج لغة روبي Ruby لكتابة كود برمجي أقل مقارنة بلغات البرمجة الأخرى، الأمر الذي يجعلها لغة مثالية للمبرمجين المبتدئين الذين يبدؤون بتعلم البرمجة ويقلل من الزمن الذي يحتاجونه لكتابة الكود وتصحيح أخطائه كما أنه يزيد من إنتاجية المطورين المحترفين ويسرع عملهم في تطوير تطبيقات فعالة لمختلف الاستخدامات.
</p>

<p>
	تُستخدم لغة روبي اليوم من قبل العديد من شركات التكنولوجيا الكبيرة فكل مواقع Airbnb و Twitter و GitHub طورت باستخدام روبي وإطار عملها الشهير <a href="https://academy.hsoub.com/programming/ruby/rails/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-ruby-on-rails-r526/" rel="">روبي أون ريلز Ruby on Rails</a> ما يدل على مدى الثقة هذه اللغة ويعزز أهميتها.
</p>

<h2 id="ruby-1">
	مميزات لغة Ruby
</h2>

<p>
	تمكنت لغة روبي من فرض نفسها كلغة برمجة قوية وهي اليوم واحدة من أفضل <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a> في العالم بفضل المميزات الكثيرة التي توفرها وأبرزها:
</p>

<ul>
	<li>
		لغة برمجة مفتوحة المصدر <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">open source</a>.
	</li>
	<li>
		من <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D9%87%D9%84-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">أسهل لغات البرمجة</a> في التعلم والفهم لذا  فهي تناسب المبتدئين في تعلم البرمجة.
	</li>
	<li>
		تعد روبي لغة برمجة عالية المستوى أكواد لغة روبي أقرب إلى اللغة الإنجليزية الطبيعية منها إلى كود برمجي، مما يجعل الكود أسهل في القراءة والكتابة.
	</li>
	<li>
		روبي هي لغة متعددة الأغراض، مما يعني أنه يمكنك كتابة برمجيات بلغة روبي في العديد من المجالات؛ لا يوجد تركيز على دعم مجال دون آخر.
	</li>
	<li>
		لغة برمجة مرنة ومتعددة الاستخدامات.
	</li>
	<li>
		توفر الكثير من المكتبات والوحدات والحزم البرمجية المعروفة باسم الجواهر gems والتي تسهل أداء الوظائف البرمجية بأقل كود برمجي.
	</li>
	<li>
		تملك مجتمع تطوير ضخم يطور اللغة ويحسنها باستمرار ويوفر مصادر تعلم تساعدك في العثور على إجابة لأي مشكلة لديك.
	</li>
	<li>
		تدعم معظم أنواع قواعد البيانات MySQL و DB2 و Oracle.
	</li>
	<li>
		متوافقة مع كافة أنظمة التشغيل مثل ويندوز Windows ولينكس Linux وماك macOS.
	</li>
	<li>
		لغة برمجة كائنية التوجه <a href="https://academy.hsoub.com/programming/java/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-objects-%D9%88%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-oop-r966/" rel=""><abbr title="Object-Oriented Programming | البرمجة كائنية التوجه"><abbr title="Object-Oriented Programming | البرمجة كائنية التوجه">OOP</abbr></abbr></a> وتدعم كذلك نماذج برمجة أخرى مثل البرمجة الإجرائية والوظيفية.
	</li>
</ul>

<h2 id="">
	عيوب لغة روبي
</h2>

<p>
	لا تخلو لغة روبي من بعض جوانب القصور شأنها شأن أي لغة برمجة أخرى ومن بعض هذه العيوب:
</p>

<ul>
	<li>
		بالرغم من كون لغة روبي لغة ديناميكية سريعة ولا تفرض قواعد كتابة صارمة فأنت لا تحتاج على سبيل المثال لتحديد أنواع المتغيرات بشكل صريح قبل استخدامها لكن هذا قد يصعب عليك عمليه اكتشاف الأخطاء وتصحيحها.
	</li>
	<li>
		بطيئة مقارنة بغيرها من لغات البرمجة لكن هذا الأمر لن يسبب أثرًا سوى في التطبيقات الضخمة والثقيلة التي تستهلك الكثير من الذاكرة.
	</li>
	<li>
		لغة روبي غير شائعة عربيًا لذا فإن العثور على مصادر مناسبة لتعلمها باللغة العربية قد يكون أقل نسبيًا مقارنة بلغات البرمجة الأخرى مثل بايثون و PHP وجافا سكريبت لكن قوة اللغة ومميزاتها الفريدة تنبئ بزيادة شعبيتها وانتشارها في الفترات المقبلة.
	</li>
</ul>

<h2 id="ruby-2">
	استخدامات لغة روبي Ruby
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="138812" href="https://academy.hsoub.com/uploads/monthly_2023_11/---.png.e35af72d6c627326117f28b2c925bfaa.png" rel=""><img alt="لغة روبي" class="ipsImage ipsImage_thumbnailed" data-fileid="138812" data-ratio="62.50" data-unique="ye97bdmvh" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2023_11/---.thumb.png.4679b77a67c11b73fa441e3fa2714af7.png"></a>
</p>

<p>
	تستخدم لغة البرمجة روبي Ruby في العديد من المجالات وإليك قائمة بأبرز هذه الاستخدامات:
</p>

<ul>
	<li>
		تطوير تطبيقات ويب ديناميكية: تعمل وتعتمد على قواعد البيانات بفضل إطار عملها القوي ريلز Ruby on Rails.
	</li>
	<li>
		تطوير تطبيقات ويب ستاتيكية: بفضل أداة توليد المواقع <a href="https://academy.hsoub.com/programming/ruby/%D9%85%D8%AF%D9%88%D9%86%D8%AA%D9%83-%D8%A7%D9%84%D8%AE%D8%A7%D8%B5%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-jekyll-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r39/" rel="">Jekyll</a> وهي حزمة برمجية مكتوبة بلغة روبي تمكنك من إنشاء موقع ويب ثابت من الصفر بسهولة بالغة.
	</li>
	<li>
		برمجة الألعاب: فهي توفر مكتبات متخصصة لمطوري الألعاب مساعدة مثل Ruby2D و Gosu تسهل مهمة برمجة الألعاب وبناء واجهاتها الرسومية.
	</li>
	<li>
		أتمتة المهام المتكررة: يمكّن استخدام لغة Ruby كتابة سكربتات لتنفيذ المهام المتكررة بسهولة مثل إرسال تقارير البريد الإلكتروني بشكل دوري أو إرسال تذكير بمواعيد معينة أو توليد الفواتير وإرسالها تلقائيًا.
	</li>
	<li>
		تطوير تطبيقات الجوال: من خلال إطار عمل روبي موشن RubyMotion لتطوير تطبيقات جوال تعمل مع أنظمة أندرويد أو iOS.
	</li>
	<li>
		تطوير تطبيقات سطح المكتب: فهي تدعم العديد من مكتبات واجهة المستخدم الرسومية GUI مثل GTK و OpenGL و Qt التي تسهل إنشاء تطبيقات سطح مكتب احترافية.
	</li>
	<li>
		استخراج بيانات الويب web scraping باستخدام مكتبات وواجهات برمجية <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> قوية تسهل الزحف إلى صفحات مواقع الويب وتحليل أكوادها واستخراج المحتوى المطلوب منها مثل ZenRows و Nokogiri.
	</li>
	<li>
		تحليل البيانات: توفر لغة روبي العديد من المكتبات القوية تسهل مهام تحليل البيانات مثل NMatrix و NArray.
	</li>
	<li>
		تطبيقات الذكاء الاصطناعي: فهي تقدم مجموعة متنوعة من مكتبات التعلم الآلي والتعلم العميق مثل مكتبة Eps و Rumale و Ruby Deep Learning.
	</li>
</ul>

<h2 id="rubyonrails">
	ما هو إطار العمل ريلز Ruby on Rails
</h2>

<p>
	تملك لغات البرمجة اليوم أطر عمل مساعدة توفر للمطورين أدوات أساسية تبسط عليهم عملية البرمجة وتساعدهم في كتابة أكواد آمنة وتتبع أفضل الممارسات والمعايير كما يوفر <a href="https://academy.hsoub.com/programming/general/%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-framework/" rel="">إطار العمل</a> الكثير من الوظائف والأدوات الجاهزة التي تحسن إنتاجية المطور بدلًا من القيام بكتابة كل شيء من البداية.
</p>

<p>
	ولهذا السبب وفرت لغة البرمجة روبي Ruby إطار عمل روبي أون ريلز <a href="https://academy.hsoub.com/programming/ruby/rails/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-ruby-on-rails-r526/" rel="">Ruby on Rails</a> أو اختصارًا ريلز الذي طوره المبرمج الدنماركي دافيد هاينماير هانسون عام 2004 ليكون إطار عمل قوي وشامل لتطوير تطبيقات الويب أو بالتحديد الواجهات الخلفية لتطبيقات الويب.
</p>

<p>
	يوفر إطار عمل ريلز واجهة سهلة الاستخدام تسهل أداء العديد من مهام التطوير مثل التحكم في صلاحيات وصول المستخدمين للموقع وتسهيل التعامل مع قاعدة البيانات مما يختصر الوقت والجهد ويساعدك على تطوير مواقع وتطبيقات قوية بزمن قياسي مقارنة بغيره من اللغات والتقنيات وهو اليوم من أشهر أطر عمل <a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA/" rel="">برمجة تطبيقات الويب</a> ويستخدم في برمجة العديد من مواقع الشركات التقنية المشهورة مثل تويتر Twitter وجيت هب GitHub.
</p>

<h2 id="-1">
	كتابة أول برنامج بلغة روبي
</h2>

<p>
	كي تتمكن من كتابة أكواد لغة روبي وتنفيذها على جهازك، تتوفر عدة طرق لتثبيت لغة روبي وفي هذه الفقرة سنشرح لك أبسط هذه الطرق لتتمكن من البدء. سوف تحتاج إلى تثبيت البرامج التالية:
</p>

<ol>
	<li>
		محرر نصوص أو محرر أكواد برمجية يساعدك على كتابة الشيفرات وتنسيقها مثل محرر فيجوال ستوديو كود Visual Studio Code أو Notepad++‎ أو أي محرر آخر تفضله.
	</li>
	<li>
		برنامج خاص يسمى مفسر لغة روبي Ruby interpreter وهو برنامج مسؤول عن ترجمة الشيفرات البرمجية التي تكتبها بلغة روبي إلى صيغة يفهما الحاسوب وينفذها، وأسهل طريقة لتثبيته هي من خلال الانتقال إلى <a href="https://www.ruby-lang.org/en/downloads/" rel="external nofollow">الرابط التالي</a> واتباع تعليمات التثبيت الموافقة لنظام تشغيلك، في حالتنا نستخدم نظام التشغيل ويندوز لذا سننقر فوق الرابط لتحميل RubyInstaller كما في الصورة التالية:
	</li>
</ol>

<p>
	بعد الانتهاء من تحميل وتثبيت البرامج المطلوبة افتح محرر الأكواد الذي تستخدمه وأنشئ ملفًا جديدًا واحفظه بالاسم الذي تختاره وبالامتداد rb. وليكن hello.rb واكتب ضمنه الكود التالي
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9486_6" style=""><span class="pln">puts </span><span class="str">"Hello World"</span><span class="pln">
puts </span><span class="str">"تعلم لغة روبي"</span></pre>

<p>
	الكود السابق يطبع ببساطة العبارتين الممررتين بعد تعليمة الطباعة puts، احفظ الملف وقم بتنفيذه ليظهر لك الخرج بالشكل التالي:
</p>

<pre class="ipsCode">تعلم لغة روبي
Hello World!
</pre>

<p>
	تهانينا! بوصولك إلى هنا تكون قد حققت أول إنجاز لك بلغة روبي Ruby، فتنفيذك لهذا البرنامج على بساطته هو نقطة انطلاقتك في رحلة اكتشاف وتعلم لغة روبي Ruby بدءًا من الأساسيات ووصولًا لتطوير تطبيقات احترافية.
</p>

<h2 id="-2">
	خطوات تعلم لغة روبي
</h2>

<p>
	إذا قررت <a href="https://academy.hsoub.com/programming/ruby/%D9%83%D9%84-%D9%85%D8%A7-%D8%AA%D8%AD%D8%AA%D8%A7%D8%AC-%D8%A5%D9%84%D9%8A%D9%87-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%80-ruby-r16/" rel="">تعلم البرمجة بلغة روبي Ruby</a> وتتساءل ما هي الخطوات التي عليك اتباعها لتعلمها من الصفر حتى الاحتراف، ففي هذه الفقرة سنلخص لك أهم خطوات تعلم روبي:
</p>

<ul>
	<li>
		<p>
			قبل البدء في تعلم لغة روبي Ruby أو أي لغة برمجة أخرى من الضروري أن تتعلم <a href="https://academy.hsoub.com/programming/advanced/%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA/" rel="">أساسيات الخوارزميات</a> والتفكير المنطقي.
		</p>
	</li>
	<li>
		<p>
			تعلم طريقة إعداد بيئة العمل الضرورية للبرمجة مثل <a href="https://academy.hsoub.com/programming/ruby/%D9%83%D9%8A%D9%81-%D8%AA%D8%AB%D8%A8%D9%91%D8%AA-ruby-%D8%B9%D9%84%D9%89-%D9%88%D9%8A%D9%86%D8%AF%D9%88%D8%B2-10-r547/" rel="">تثبيت لغة روبي Ruby</a> وتثبيت محرر شيفرات برمجية على حاسوبك لتتمكن من كتابة أكواد روبي وتنفيذها.
		</p>
	</li>
	<li>
		<p>
			تعلم أساسيات لغة روبي مثل التعليقات والثوابت والمتغيرات والمعاملات Operators وتعلم أنواع البيانات المختلفة كالأرقام و<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-ruby-%E2%80%93-%D8%A7%D9%84%D9%82%D9%8A%D9%85-%D8%A7%D9%84%D8%AD%D8%B1%D9%81%D9%8A%D8%A9%D8%8C-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1-%D9%88%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%A3%D8%B3%D8%B7%D8%B1-%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-r538/" rel="">النصوص</a> والقيم المنطقية وطريقة التعامل معها.
		</p>
	</li>
	<li>
		<p>
			تعلم <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r274/" rel="">العبارات الشرطية</a> و <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-loops-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r284/" rel="">الحلقات التكرارية في لغة روبي</a> وأنواعها المختلفة
		</p>
	</li>
	<li>
		<p>
			تعلم طريقة التعامل مع <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%84%D8%A7%D8%AA-ranges-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r283/" rel="">المجالات</a> وا<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-arrays-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r280/" rel="">لمصفوفات arrays</a> و<a href="https://academy.hsoub.com/programming/ruby/%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D8%A7%D9%84%D8%AA%D9%82%D8%B7%D9%8A%D8%B9-hash-tables-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r282/" rel="">جداول التقطيع Hashe tables </a>وفائدتها وطريقة استخدامها.
		</p>
	</li>
	<li>
		<p>
			تعرف على أهم الدوال المدمجة في لغة روبي Built-in functions وما الذي تقوم به، وكيفية كتابة دوال خاصة بك واستدعائها.
		</p>
	</li>
	<li>
		<p>
			طبق ما تعلمته من مفاهيم على برامج عملية بسيطة مثل برنامج للآلة الحاسبة وتدرب على كتابة الشيفرات وتصحيح الأخطاء البرمجية التي تواجهك وعندما تتأكد من إتقان كافة المفاهيم الأساسية يمكنك متابعة خطوات التعلم.
		</p>
	</li>
	<li>
		<p>
			تعلم مفاهيم أكثر تقدمًا مثل البرمجة كائنية التوجه في لغة روبي ومفاهيم <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-ruby-r628/" rel="">الأصناف classes</a> والكائنات objects والنسخ instances.
		</p>
	</li>
	<li>
		<p>
			تعلم أهم مكتبات وأطر عمل روبي التي تفيدك في <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AC%D8%A7%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">مجال تخصصك البرمجي</a> وطريقة استخدامها في تطوير مشاريع بسيطة، ففي حال كنت تريد العمل كمطور ويب سيكون لزامًا عليك تعلم إطار ريلز Ruby on Rails في تطوير تطبيقاتك بسرعة واحترافية.
		</p>
	</li>
	<li>
		<p>
			تعلم طريقة استخدام أدوات تساعدك في عملك كمطور مثل <a href="https://academy.hsoub.com/devops/cloud-computing/docker/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-docker-r3/" rel="">Docker</a> و <a href="https://academy.hsoub.com/programming/workflow/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A5%D9%84%D9%89-%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-vagrant-r269/" rel="">Vagrant</a> و <a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%A7-%D9%87%D9%88-git%D8%9F-r1592/" rel="">Git</a>.
		</p>
	</li>
	<li>
		<p>
			ابدأ ببناء تطبيقات فعلية وضمّن فيها ميزات مختلفة وتعلم طريقة نشر التطبيقات في خادم فعلي لتعزز معرفتك النظرية وتبني معرض أعمال يضاف لسيرتك الذاتية ويعزز فرصتك في العثور على عمل مناسب.
		</p>
	</li>
</ul>

<h2 id="-3">
	مصادر تعلم لغة روبي
</h2>

<p>
	يمكن أن تتعلم أي لغة برمجة عبر مسارين، الأول هو من خلال الدراسة الجامعية والالتحاق بإحدى الكليات التقنية، وهو مسار طويل يحتاج إلى وقت وجهد كبيرين. أما الثاني، فهو من خلال اختيار التعلم الذاتي الذي يوفر عليك الوقت والجهد.
</p>

<p>
	إذا قررت تعلم لغة روبي Ruby بشكل ذاتي وكنت تبحث عن مصادر موثوقة تساعدك في التعلم يمكنك مطالعة <a href="https://academy.hsoub.com/learn/ruby-web-application-development/" rel="">دورة تطوير تطبيقات الويب باستخدام لغة Ruby</a> من أكاديمية حسوب وهي دورة شاملة تضم عدة مسارات تعلمك كل ما يتعلق بلغة Ruby وإطار عملها ريلز Rails بدون معرفة سابقة بالبرمجة وتؤهلك لتصبح مطوّر محترف وتدخل سوق العمل خلال زمن قياسي، كما ستحظى بدعم مستمر من فريق من المدربين المحترفين الذي يجيبون على كافة استفساراتك خلال التعلم، وفي نهاية الدورة يمكنك التقدم للاختبار والحصول على شهادة معتمدة تعزز مسارك المهني.
</p>

<p>
	كما يمكنك الاطلاع على <a href="https://wiki.hsoub.com/Ruby" rel="external">توثيق Ruby في موسوعة حسوب</a> التي توفر لك شرحًا متكاملًا باللغة العربية يعرفك على بنية اللغة ونشأتها، ومميزاتها ويشرح طريقة تثبيتها وكتابة شيفراتها البرمجية وغيرها من العناوين التي تهم أي مبرمج.
</p>

<p>
	هل تريد المزيد، ستجد في أكاديمية حسوب الكثير من <a href="https://academy.hsoub.com/programming/ruby/" rel="">الدروس والمقالات</a> والسلاسل التعلمية المتكاملة التي تساعدك على تعلم لغة روبي Ruby وإطار عملها الشهير ريلز <a href="https://academy.hsoub.com/programming/ruby/rails/" rel="">Ruby on Rails</a>، وأخيرًا يمكنك أخذ جولة في قناة أكاديمية حسوب على يوتيوب ومشاهدة العديد من مقاطع الفيديو حول لغة روبي ومميزاتها ومقارنتها مع لغات البرمجة الأخرى.
</p>

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="499" id="ips_uid_6303_6" src="https://academy.hsoub.com/applications/core/interface/index.html" title="تعرّف على لغة البرمجة Ruby" width="887" data-embed-src="https://www.youtube.com/embed/8gjN-ZoATfo"></iframe>
</p>

<p>
	يمكنك أيضًا الرجوع إلى <a href="https://wiki.hsoub.com/Ruby" rel="external">توثيق لغة روبي</a> العربية وايضًا <a href="https://wiki.hsoub.com/Rails" rel="external">توثيق ريلز Rails</a> الذي توفره موسوعة حسوب للاطلاع على معلومات وافية عن هذه اللغة.
</p>

<h2 id="-4">
	الخلاصة
</h2>

<p>
	تعرفنا في هذا المقال على كل ما يخص لغة البرمجة روبي Ruby وأبرز تطبيقاتها واستخداماتها واستعرضنا أهم مميزات وعيوب اللغة وأهم مصادر تعلمها العربية كما تعرفنا بشكل مختصر على إطار عملها الشهير Ruby on Rails الذي يوفر لك أداة قوية لإنشاء تطبيقات ويب متقدمة بسرعة واحترافية.
</p>

<h2 id="-5">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-ruby-r529/" rel="">الدليل السريع إلى لغة البرمجة روبي Ruby</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-ruby-r628/" rel="">الأصناف في لغة البرمجة Ruby</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D9%83%D9%8A%D9%81-%D8%AA%D9%83%D8%AA%D8%A8-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC%D9%83-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%A8%D9%84%D8%BA%D8%A9-ruby-r600/" rel="">كيف تكتب برنامجك الأول بلغة Ruby</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%AF%D9%84%D9%8A%D9%84-%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-%D8%B1%D9%88%D8%A8%D9%8A-ruby-r886/" rel="">دليل تنسيق شيفرات روبي Ruby</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2173</guid><pubDate>Mon, 27 Nov 2023 13:02:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62D;&#x648;&#x64A;&#x644; &#x628;&#x64A;&#x646; &#x623;&#x646;&#x648;&#x627;&#x639; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AA%D8%AD%D9%88%D9%8A%D9%84-%D8%A8%D9%8A%D9%86-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2177/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_11/----.png.684c0e6efc6ef432af13e5ffcf06476c.png" /></p>
<p>
	يحتوي كل برنامج على العديد من <a href="https://academy.hsoub.com/programming/ruby/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-data-types-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2138/" rel="">أنواع البيانات</a>، إذ يجب أن تكون العمليات على البيانات بين نفس النوع من البيانات دومًا، مثل العمليات الرياضية على الأرقام، أو دمج السلاسل النصية معًا، ويمكن أن تكون هذه البيانات من مصادر خارجية، مثل لوحة المفاتيح أو استجابة <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">لواجهة برمجة تطبيقات <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a> أو قاعدة بيانات، إذ سنحتاج في هذه الحالة إلى التحويل بين أنواع البيانات قبل تنفيذ العمليات عليها، ولذلك الغرض توفر لغة <a href="https://academy.hsoub.com/programming/ruby/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-ruby-r636//" rel="">روبي Ruby</a> العديد من الطرق لتحويل القيم من نوع بيانات إلى آخر، لذلك سنتعرف في هذا المقال على طرق تحويل السلاسل النصية إلى أعداد، والكائنات إلى سلاسل نصية، والسلاسل النصية إلى مصفوفات، والتحويل بين السلاسل النصية والرموز.
</p>

<h2 id="">
	تحويل السلاسل النصية إلى أعداد
</h2>

<p>
	توفر روبي التابعين <a href="https://wiki.hsoub.com/Ruby/String/to_i" rel="external"><code>to_i</code></a> و <a href="https://wiki.hsoub.com/Ruby/String/to_f" rel="external"><code>to_f</code></a> لتحويل السلاسل النصية إلى أعداد، إذ يحوّل <code>to_i</code> السلسلة النصية إلى عدد صحيح، ويحول التابع <code>to_f</code> السلسلة النصية إلى عدد عشري:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_8" style=""><span class="str">"5"</span><span class="pun">.</span><span class="pln">to_i       </span><span class="com"># 5</span><span class="pln">
</span><span class="str">"55.5"</span><span class="pun">.</span><span class="pln">to_i    </span><span class="com"># 55</span><span class="pln">
</span><span class="str">"55.5"</span><span class="pun">.</span><span class="pln">to_f    </span><span class="com"># 55.5</span></pre>

<p>
	لتوضيح ذلك، سننشئ برنامجًا صغيرًا يطلب من المستخدم إدخال عددين ويعرض مجموعهما، لذا ننشئ ملف جديد نسميه <code>adder.rb</code> ونضيف إليه الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_10" style=""><span class="pln">print </span><span class="str">"What is the first number? "</span><span class="pln">
first_number </span><span class="pun">=</span><span class="pln"> gets</span><span class="pun">.</span><span class="pln">chop

print </span><span class="str">"What is the second number? "</span><span class="pln">
second_number </span><span class="pun">=</span><span class="pln"> gets</span><span class="pun">.</span><span class="pln">chop

sum </span><span class="pun">=</span><span class="pln"> first_number </span><span class="pun">+</span><span class="pln"> second_number

print sum</span></pre>

<p>
	عند تشغيل البرنامج:
</p>

<pre class="ipsCode">$ ruby adder.rb
</pre>

<p>
	سنحصل على الإجابة التالية:
</p>

<pre class="ipsCode">What is the first number? 5
What is the second number? 5
55
</pre>

<p>
	نلا حظ أن مجموع العدد 5 مع 5 هو 55 وهي نتيجة خاطئة، والسبب في ذلك أن القيم المُدخلة من لوحة المفاتيح لم ترسل العدد 5 بل أرسلت الحرف "5"، أي أن البرنامج ينظر إلى كل من العددين المدخلين على أنهما سلاسل نصية، وعند جمع السلسلتين النصين "5" و "5" سنحصل على السلسلة النصية الجديدة "55" وهي النتيجة التي ظهرت، ولحل المشكلة يجب تحويل المدخلات إلى أعداد أولًا قبل تنفيذ عملية الجمع، ويمكننا ذلك باستخدام التابع <code>to_f</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_12" style=""><span class="pln">print </span><span class="str">"What is the first number? "</span><span class="pln">
first_number </span><span class="pun">=</span><span class="pln"> gets</span><span class="pun">.</span><span class="pln">chop

print </span><span class="str">"What is the second number? "</span><span class="pln">
second_number </span><span class="pun">=</span><span class="pln"> gets</span><span class="pun">.</span><span class="pln">chop

</span><span class="com"># convert strings to numbers</span><span class="pln">
first_number </span><span class="pun">=</span><span class="pln"> first_number</span><span class="pun">.</span><span class="pln">to_f
second_number </span><span class="pun">=</span><span class="pln"> second_number</span><span class="pun">.</span><span class="pln">to_f

sum </span><span class="pun">=</span><span class="pln"> first_number </span><span class="pun">+</span><span class="pln"> second_number

print sum</span></pre>

<p>
	ننفذ البرنامج مجددًا:
</p>

<pre class="ipsCode">$ ruby adder.rb
</pre>

<p>
	لنلاحظ جمع الأعداد حسابيًا وإظهار النتيجة الصحيحة:
</p>

<pre class="ipsCode">What is the first number? 5
What is the second number? 5
10.0
</pre>

<p>
	عند محاولة تحويل سلسلة نصية غير قابلة للتحويل إلى عدد باستخدام أحد التابعين <code>to_i</code> و <code>to_f</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_14" style=""><span class="str">"123-abc"</span><span class="pun">.</span><span class="pln">to_i</span></pre>

<p>
	سيكون الخرج:
</p>

<pre class="ipsCode">123
</pre>

<p>
	نلاحظ تحويل السلسلة النصية <code>"123-abc"</code> إلى العدد الصحيح 123 باستخدام التابع <code>to_i</code>، إذ يتوقف ذلك التابع عندما يصل إلى أول محرف غير رقمي ويعيد النتيجة. يستغل مطورو الويب هذه الخاصية في روبي لإنشاء <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">روابط URL</a> مثل <code>15-sammy-shark</code>، إذ يدل الرقم 15 في ذلك النص على معرف داخلي للبحث ضمن سجل قاعدة البيانات، أما القسم<code>sammy-shark</code> هو وصف نصي للرابط ليسهل قراءته، وعند تحويل القيمة <code>15-sammy-shark</code> إلى عدد صحيح باستخدام التابع <code>to_i</code>، سيتجاهل التابع الجزء النصي <code>-sammy-shark</code> ويعيد العدد الصحيح 15 الذي يمكن استخدامه للبحث ضمن سجل قاعدة البيانات، وفيما يلي مثال آخر عن تحويل سلسلة نصية غير عددية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_16" style=""><span class="str">"abc"</span><span class="pun">.</span><span class="pln">to_i</span></pre>

<p>
	سيكون الخرج:
</p>

<pre class="ipsCode">0
</pre>

<p>
	نلاحظ أن التابع <code>to_i</code> يعيد القيمة 0، إذ لا يمكن تحويل أي من المحارف في تلك السلسلة النصية إلى عدد صحيح، وقد يسبب ذلك مشاكل فإذا أدخل المستخدم بإدخال القيمة <code>"abc"</code> ضمن برنامج ما وحولنا هذه القيمة إلى عدد صحيح ثم أجرينا عملية القسمة على ذلك العدد سيحدث خطأ لعدم إمكانية القسمة على الصفر، ولحل تلك المشكلة توفّر روبي طريقةً أخرى لتحويل البيانات إلى أعداد باستخدام أحد التابعين<code>Integer</code> أو<code>Float</code> للتحويل:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_18" style=""><span class="typ">Integer</span><span class="pun">(</span><span class="str">"123"</span><span class="pun">)</span></pre>

<p>
	والخرج:
</p>

<pre class="ipsCode">123
</pre>

<p>
	عند محاولة تحويل قيمة غير صالحة للتحويل باستخدام التابع <code>Integer</code> سيرمي خطأ في حال لم تكن كل السلسلة النصية قابلة للتحويل:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_20" style=""><span class="typ">Integer</span><span class="pun">(</span><span class="str">"123abc"</span><span class="pun">)</span></pre>

<p>
	سيكون الخرج في هذه الحالة على النحو التالي:
</p>

<pre class="ipsCode">ArgumentError: invalid value for Integer(): "123abc"
</pre>

<p>
	نستفيد من ذلك الخطأ لإظهار رسالة للمستخدم مثلًا نطلب منه إدخال قيمة عددية صحيحة، مما يضمن سلامة البيانات المُدخلة وأن القيمة التي أدخلها المستخدم هي المقصودة. سنتعرف في الفقرة القادمة على طريقة تحويل أنواع أخرى من البيانات إلى سلاسل نصية.
</p>

<h2 id="-1">
	تحويل البيانات إلى سلاسل نصية
</h2>

<p>
	توفر لغة روبي التابع <code>to_s</code> لتحويل أي نوع من البيانات إلى سلسلة نصية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_22" style=""><span class="lit">25.to</span><span class="pln">_s                    </span><span class="com"># "25"</span><span class="pln">
</span><span class="pun">(</span><span class="lit">25.5</span><span class="pun">).</span><span class="pln">to_s                </span><span class="com"># "25.5"</span><span class="pln">
</span><span class="pun">[</span><span class="str">"Sammy"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Shark"</span><span class="pun">].</span><span class="pln">to_s    </span><span class="com"># "[\"Sammy\", \"Shark\"]"</span></pre>

<p>
	نحتاج غالبًا قبل عرض البيانات للمستخدم إلى تحويل البيانات إلى سلاسل نصية، ففي المثال التالي سنحاول طباعة قيمة من نوع سلسلة نصية وقيمة عددية. نبدأ بإنشاء ملف بالاسم <code>calories.rb</code> يحتوي على التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_24" style=""><span class="pln">user </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy"</span><span class="pln">
calories </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pln">

print </span><span class="str">"Congratulations, "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> user </span><span class="pun">+</span><span class="pln"> </span><span class="str">"! You just burned "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> calories </span><span class="pun">+</span><span class="pln"> </span><span class="str">" calories during this workout."</span></pre>

<p>
	أضفنا قيم المتغيرات في المثال السابق يدويًا، ولكن عادة ما سنستقبل تلك القيم من مصدر خارجي مثل مدخلات المستخدم أو من <a href="https://academy.hsoub.com/devops/servers/databases/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-database/" rel="">قاعدة البيانات</a> أو غيرها، والآن ننفذ البرنامج:
</p>

<pre class="ipsCode">$ ruby calories.rb
</pre>

<p>
	ليظهر لنا رسالة الخطأ التالية:
</p>

<pre class="ipsCode">...
TypeError: no implicit conversion of Integer into String (TypeError)
</pre>

<p>
	لا يمكن إضافة المتغير <code>calories</code> إلى باقي النص الذي نحاول طباعته لأنه يحتوي على قيمة من نوع عدد صحيح لا يمكن تحويلها إلى سلسلة نصية بإضافة علامات تنصيص حولها بل باستخدام التابع <code>to_s</code> قبل دمجها مع بقية النص المطبوع. لحل المشكلة: نعدّل السطر الذي يحتوي على النتيجة ونحول قيمة المتغير <code>calories</code> إلى سلسلة نصية باستخدام التابع <code>to_s</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_27" style=""><span class="pln">user </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy"</span><span class="pln">
calories </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pln">

print </span><span class="str">"Congratulations, "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> user </span><span class="pun">+</span><span class="pln"> </span><span class="str">"! You just burned "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> calories</span><span class="pun">.</span><span class="pln">to_s </span><span class="pun">+</span><span class="pln"> </span><span class="str">" calories during this workout."</span></pre>

<p>
	نُنفذ البرنامج مجددًا ونلاحظ اختفاء الخطأ السابقة وظهور النتيجة المطلوبة:
</p>

<pre class="ipsCode">Congratulations, Sammy! You just burned 100 calories during this workout.
</pre>

<p>
	يمكن أيضًا استخدام خاصية <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-ruby-%E2%80%93-%D8%A7%D9%84%D8%AF%D9%85%D8%AC%D8%8C-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D9%8A%D9%81%D8%A7%D8%A1-%D9%88%D8%AD%D9%81%D8%B8%D9%87%D8%A7-%D9%81%D9%8A-%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-r537/" rel="">استيفاء النص interpolation</a> المتوفرة في لغة روبي، والتي تحول الكائنات إلى سلاسل نصية تلقائيًا دون الحاجة لأي عمليات تحويل إضافية، لنحاول استخدامها في المثال السابق على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_29" style=""><span class="pln">print </span><span class="str">"Congratulations, #{user}! You just burned #{calories} calories during this workout."</span></pre>

<p>
	ننفذ البرنامج مرةً أخرى ونلاحظ ظهور النتيجة نفسها، إذ توفر جميع الكائنات في لغة روبي التابع <code>to_s</code> الذي يحول الكائن إلى سلسلة نصية بطريقة موحدة، وفي حال أردنا التحويل بطريقة مختلفة يمكننا كتابة شيفرة مخصصة لذلك.
</p>

<p>
	توفر جميع الكائنات في لغة روبي التابع <code>inspect</code> الذي يفيد خلال مرحلة التطوير في عملية تنقيح الأخطاء، إذ يعيد ذلك التابع نفس النتيجة التي يعيدها التابع <code>to_s</code> مع بيانات أكثر تفصيلًا عن الكائن، لذا يقتصر استخدام ذلك التابع في مرحلة التطوير فقط، ويمكن استخدامه مع التابع <code>puts</code> لعرض قيم المتغيرات أثناء تطوير البرنامج. سنتعرف في الفقرة القادمة على طريقة تحويل سلسلة نصية إلى مصفوفة.
</p>

<h2 id="-2">
	تحويل السلاسل النصية إلى مصفوفات
</h2>

<p>
	يمكن تحويل أي سلسلة نصية إلى مصفوفة باستخدام التابع <code>split</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_31" style=""><span class="str">"one two three"</span><span class="pun">.</span><span class="pln">split</span></pre>

<p>
	ويكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">["one", "two", "three"]
</pre>

<p>
	يمكن تحديد المحرف الذي نريد استخدامه مثل محدد لفصل السلسلة النصية إلى عناصر بتمريره بمثابة معامل إلى التابع <code>split</code>. سنحوّل في المثال التالي سلسلة نصية تحتوي على قيم مفصولة بفواصل إلى مصفوفة ثم سنرتبها ونطبع قيمة كل عنصر منها على الشاشة، ونبدأ بإنشاء ملف بالاسم "data_import.rb" يحتوي على الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_34" style=""><span class="pln">data </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Tiger,Great White,Hammerhead,Whale,Bullhead"</span><span class="pln">

</span><span class="com"># Convert data to an array by splitting on commas</span><span class="pln">
sharks </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="str">","</span><span class="pun">)</span><span class="pln">

</span><span class="com"># Sort the sharks alphabetically</span><span class="pln">
sharks </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">!</span><span class="pln">

</span><span class="com"># Print out the sharks by iterating through the array</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">each</span><span class="pun">{|</span><span class="pln">shark</span><span class="pun">|</span><span class="pln"> puts shark </span><span class="pun">}</span></pre>

<p>
	ننفذ البرنامج:
</p>

<pre class="ipsCode">$ ruby data_import.rb
</pre>

<p>
	لنحصل على الخرج التالي:
</p>

<pre class="ipsCode">Bullhead
Great White
Hammerhead
Tiger
Whale
</pre>

<p>
	نلاحظ مدى قوة المصفوفات في لغة روبي والاستخدامات المتعددة لها. سنتعلم في الفقرة التالية طريقة التحويل بين السلاسل النصية والرموز.
</p>

<h2 id="-3">
	التحويل بين السلاسل النصية والرموز
</h2>

<p>
	يمكن تحويل رمز إلى سلسلة نصية لنتمكن من طباعته، وقد نحتاج أحيانًا لتحويل سلسلة نصية إلى رمز لاستخدامه للبحث ضمن <a href="https://academy.hsoub.com/programming/ruby/%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D8%A7%D9%84%D8%AA%D9%82%D8%B7%D9%8A%D8%B9-hash-tables-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r282/" rel="">جدول Hash</a>، إذ يمكن للتابع <code>to_s</code> تحويل الرموز إلى سلاسل نصية مباشرةً:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_36" style=""><span class="pun">:</span><span class="pln">language</span><span class="pun">.</span><span class="pln">to_s</span></pre>

<p>
	ويكون الخرج:
</p>

<pre class="ipsCode">"language"
</pre>

<p>
	يمكننا التعديل على الشكل النهائي للسلسلة النصية المُعبرة عن الرمز، ففي المثال التالي سنحول الرمز <code>first_name:</code> إلى السلسلة النصية الأوضح والأسهل بالقراءة <code>"First name"</code> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_38" style=""><span class="pln">string </span><span class="pun">=</span><span class="pln"> </span><span class="pun">:</span><span class="pln">first_name</span><span class="pun">.</span><span class="pln">to_s

</span><span class="com"># replace underscore with a space and capitalize</span><span class="pln">
string </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="pln">gsub</span><span class="pun">(</span><span class="str">"_"</span><span class="pun">,</span><span class="str">" "</span><span class="pun">).</span><span class="pln">capitalize</span></pre>

<p>
	يمكن تحويل السلاسل النصية إلى رموز باستخدام التابع <code>to_sym</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_40" style=""><span class="str">"first_name"</span><span class="pun">.</span><span class="pln">to_sym</span></pre>

<p>
	وبذلك يكون الخرج:
</p>

<pre class="ipsCode">:first_name
</pre>

<p>
	لتحويل السلسلة النصية <code>"First name"</code> إلى الرمز <code>first_name:</code> مجددًا، يجب أولًا تحويل جميع الأحرف إلى الحالة الصغيرة واستبدال المسافات بشرطات سفلية على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2892_42" style=""><span class="pln">string </span><span class="pun">=</span><span class="pln"> </span><span class="str">"First name"</span><span class="pln">

</span><span class="com"># replace spaces with underscores and convert to lowercase</span><span class="pln">
string </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="pln">gsub</span><span class="pun">(</span><span class="str">" "</span><span class="pun">,</span><span class="str">"_"</span><span class="pun">).</span><span class="pln">downcase

</span><span class="com"># Convert to symbol</span><span class="pln">
symbol </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="pln">to_sym</span></pre>

<p>
	نحتاج كثيرًا للتحويل بين الرموز والسلاسل النصية، سواءٌ لعرض رمز ما بشكلٍ سهل القراءة للمستخدم أو لاستخدام السلسلة النصية للبحث عن مفتاح محدد ضمن جدول Hash الذي يستخدم الرموز من أجل مفاتيحه.
</p>

<h2 id="-4">
	الخاتمة
</h2>

<p>
	تعرفنا في هذا المقال على طرق تحويل بعض أنواع البيانات الأساسية إلى <a href="https://academy.hsoub.com/programming/general/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r1726/" rel="">أنواع بيانات</a> أخرى باستخدام التوابع التي توفرها لغة روبي ضمن الكائنات، مثل تحويل الأرقام إلى سلاسل نصية، والسلاسل النصية إلى مصفوفات، والتحويل بين الرموز والسلاسل النصية، إذ من المهم التعرف على طرق التحويل تلك للتعامل مع أنواع البيانات المختلفة وتنفيذ العمليات عليها.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-convert-data-types-in-ruby" rel="external nofollow">How To Convert Data Types in Ruby</a> لصاحبه Brian Hogan.
</p>

<h2 id="-5">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/ruby/%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2142/" rel="">توابع المصفوفات في لغة روبي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%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-strings-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2139/" rel="">السلاسل النصية في لغة روبي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r1726/" rel="">دليلك الشامل إلى أنواع البيانات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2177</guid><pubDate>Tue, 07 Nov 2023 13:00:00 +0000</pubDate></item><item><title>&#x62A;&#x648;&#x627;&#x628;&#x639; &#x627;&#x644;&#x645;&#x635;&#x641;&#x648;&#x641;&#x627;&#x62A; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2142/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_10/---.png.dc84bac7d453d8a8bc5c34d0f282c896.png" /></p>
<p>
	تسمح <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-arrays-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2141/" rel="">المصفوفات arrays</a> بتمثيل قائمة من البيانات معًا وتخزينها ضمن متغير واحد لنتمكن من إجراء العمليات المختلفة على تلك البيانات، مثل فرزها أو إزالة العناصر المكررة منها، أو عكس ترتيبها، أو استخراج أجزاء من المصفوفة، أو البحث ضمنها عن بيانات محددة، ويمكننا أيضًا تحويل المصفوفة إلى سلسلة نصية أو إلى مصفوفة بيانات أخرى أو دمج عناصر المصفوفة معًا في قيمة واحدة. سنتعرف في هذا المقال على بعض التوابع التي توفرها <a href="https://academy.hsoub.com/programming/ruby/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-ruby-r636/" rel="">لغة روبي</a> للتعامل مع <a href="https://academy.hsoub.com/programming/general/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r1726/" rel="">البيانات</a> ضمن المصفوفات. سنلاحظ انتهاء أسماء بعض تلك التوابع بعلامة تعجب <code>!</code>، مما يشير أن هذا التابع سيعدل على قيمة المصفوفة الأصلية وقد يرمي استثناءات، ويوجد غالبًا تابع مقابل بنفس الاسم لمعظم التوابع الموجودة ضمن المصفوفات ولكن ينتهي بهذه اللاحقة. يوجد كذلك توابع أخرى تنتهي بعلامة استفهام <code>?</code> وهي توابع تعيد قيمة بوليانية منطقية تشير، ويُعد هذا الأسلوب شائعًا في تسمية التوابع ضمن روبي، وسنبدأ بالتعرف على توابع المصفوفات بدايةً من خلال عدة طرق للوصول إلى العناصر ضمن المصفوفة.
</p>

<h2>
	الوصول إلى عنصر من المصفوفة
</h2>

<p>
	تعرفنا في <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-arrays-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2141/" rel="">المقال السابق</a> على طريقة الوصول لعنصر محدد ضمن المصفوفة باستخدام رقم الفهرس الخاص به والذي يبدأ من الصفر على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_8" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pun">]</span><span class="pln">
sharks</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="com"># "Tiger"</span><span class="pln">
sharks</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="com"># "Great White"</span><span class="pln">
sharks</span><span class="pun">[-</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="com"># "Angel"</span></pre>

<p>
	وتعرفنا أيضًا على كل من التابعين <a href="https://wiki.hsoub.com/Ruby/Array/first" rel="external"><code>first</code></a> و <a href="https://wiki.hsoub.com/Ruby/Array/last" rel="external"><code>last</code></a> واللذان يمكن استخدامهما للحصول على أول وآخر عنصر من المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_10" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pun">]</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">first </span><span class="com"># "Tiger"</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">last </span><span class="com"># "Angel"</span></pre>

<p>
	وعند الوصول لعنصر غير موجود ضمن المصفوفة، سنحصل على القيمة <code>nil</code>، وإذا أردنا أن ينتج عن تلك العملية خطأ فيمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/fetch" rel="external"><code>fetch</code></a>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_12" style=""><span class="pln">sharks</span><span class="pun">.</span><span class="pln">fetch</span><span class="pun">(</span><span class="lit">42</span><span class="pun">)</span></pre>

<p>
	ليكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">IndexError: index 42 outside of array bounds: -4...4
</pre>

<p>
	ويمكن تحديد قيمة افتراضية للعناصر غير الموجودة بدلًا من رمي خطأ، مثل تمرير تلك القيمة الافتراضية مثل وسيط ثانٍ للتابع <code>fetch</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_14" style=""><span class="pln">sharks</span><span class="pun">.</span><span class="pln">fetch</span><span class="pun">(</span><span class="lit">42</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Nope"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># "Nope"</span></pre>

<p>
	سنتعرف في الفقرة التالية على طريقة الحصول على عدة عناصر من المصفوفة معًا.
</p>

<h2>
	استخراج عدة عناصر من المصفوفة
</h2>

<p>
	قد نحتاج أحيانًا للحصول على عدة عناصر من المصفوفة معًا بدلًا من عنصر واحد فقط، ويمكننا ذلك عبر تحديد رقم الفهرس لأول عنصر نريده من المصفوفة، ثم تمرير عدد العناصر التي نريد استخراجها بدءًا من ذلك العنصر، لتُنشأ مصفوفةٌ جديدةٌ تحتوي على تلك العناصر المحددة، فمثلًا يمكن استخراج العنصرين المتوسطين من المصفوفة <code>sharks</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_16" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pun">]</span><span class="pln">
sharks</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="com"># ["Great White", "Hammerhead"]</span></pre>

<p>
	نبدأ من الفهرس رقم 1 الذي يحتوي على قيمة <code>"Great White"</code> ونحدد بعدها عدد العناصر التي نريد استخراجها وهو 2، وبذلك تُنشأ مصفوفة جديدة تحتوي على <code>"Great White"</code> و <code>"Hammerhead"</code>. يمكن استخدام التابع <code>slice</code> لإجراء نفس العملية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_18" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pun">]</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">slice</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="com"># ["Great White", "Hammerhead"]</span></pre>

<p>
	يعيد التابع <a href="https://wiki.hsoub.com/Ruby/Array/slice" rel="external"><code>slice</code></a> مصفوفةً جديدةً دون التعديل على المصفوفة الأصلية، ولكن إذا استخدمنا التابع <a href="https://wiki.hsoub.com/Ruby/Array/slice!" rel="external"><code>!slice</code></a> ستتغير قيمة المصفوفة الأصلية. يمكن أيضًا استخدام التابع <code>take</code> لاستخراج عدد محدد من العناصر بدءًا من بداية المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_20" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pun">]</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">take</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="com"># ["Tiger", "Great White"]</span></pre>

<p>
	قد نحتاج لاستخراج عنصر عشوائي من المصفوفة بدلًا من قيمة محددة، وسنتعرف على طريقة تنفيذ ذلك في الفقرة التالية.
</p>

<h2>
	الحصول على عنصر عشوائي من المصفوفة
</h2>

<p>
	قد نحتاج في بعض الحالات لاستخراج قيمة عشوائية لا على التعيين من مصفوفة ما، خصوصًا عند تطوير بعض الألعاب التي تعتمد على الحظ، إذ يمكننا تنفيذ ذلك بتخزين جميع الخيارات الممكنة ضمن مصفوفة واختيار إحداها بتوليد رقم فهرس عشوائي بين الرقم 0 ورقم آخر فهرس لآخر عنصر من المصفوفة. تتيح لك روبي طريقةً أسهل عبر التابع <a href="https://wiki.hsoub.com/Ruby/Array/sample" rel="external"><code>sample</code></a>، الذي يعيد عنصرًا عشوائيًا من المصفوفة مباشرةً على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_22" style=""><span class="pln">answers </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Yes"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"No"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Maybe"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Ask again later"</span><span class="pun">]</span><span class="pln">
print answers</span><span class="pun">.</span><span class="pln">sample</span></pre>

<p>
	ويكون الخرج:
</p>

<pre class="ipsCode">Maybe
</pre>

<p>
	يقبل التابع <code>sample</code> عددًا مثل وسيط أول، ويعيد مصفوفةً تحتوي على عدد محدد من العناصر العشوائية، فإذا كنا بحاجة لأكثر من عنصر عشوائي، يمكننا تمرير العدد المطلوب لذلك التابع كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_24" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
sample </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">sample</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln">
print sample</span></pre>

<p>
	ليكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">["Whale", "Great White"]
</pre>

<p>
	سنتعرف في الفقرة التالية على طرق البحث عن عناصر محددة داخل مصفوفة.
</p>

<h2>
	البحث وتصفية عناصر المصفوفة
</h2>

<p>
	يمكننا البحث عن عناصر محددة داخل مصفوفة بالمرور على عناصر تلك المصفوفة واحدًا تلو الآخر وفحص كل عنصر منها إلى أن نجد العنصر المطلوب، ولكن روبي توفر عدة توابع تُسهل عملية البحث تلك ضمن المصفوفات، إذ يمكن مثلًا التحقق ما إذا كان العنصر موجودًا ضمن المصفوفة باستخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/include" rel="external"><code>?include</code></a>، الذي يعيد القيمة <code>true</code> في حال كان العنصر المحدد موجودًا:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_26" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">include</span><span class="pun">?</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pln"> </span><span class="com"># true</span><span class="pln">

</span><span class="pun">[</span><span class="str">"a"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"b"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"c"</span><span class="pun">].</span><span class="pln">include</span><span class="pun">?</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="com"># false</span></pre>

<p>
	إذ يبحث التابع ضمن المصفوفة عن العنصر الذي يطابق القيمة المُمررة له تمامًا، أي لا يمكننا مثلًا البحث عن أجزاء من سلسلة نصية على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_28" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">include</span><span class="pun">?</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pln"> </span><span class="com"># true</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">include</span><span class="pun">?</span><span class="pln"> </span><span class="str">"tiger"</span><span class="pln"> </span><span class="com"># false</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">include</span><span class="pun">?</span><span class="pln"> </span><span class="str">"ti"</span><span class="pln"> </span><span class="com"># false</span></pre>

<p>
	يمكن حل المشكلة باستخدام التابع <code>find</code>، الذي يعيد أول عنصر يطابق الشرط المحدد داخل المصفوفة، فمثلًا للبحث عن أول عنصر يحتوي على الحرف <code>a</code> ضمن مصفوفة <code>sharks</code>، يمكن استخدام التابع <code>each</code> للمرور على كل عنصر بالترتيب والتوقف عند العثور على العنصر الأول المطابق لهذا الشرط كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_30" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
result </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">each </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">shark</span><span class="pun">|</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">include</span><span class="pun">?</span><span class="pln"> </span><span class="str">"a"</span><span class="pln">
result </span><span class="pun">=</span><span class="pln"> shark
</span><span class="kwd">break</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	أو استخدام التابع <code>find</code> بدلًا من ذلك لتنفيذ نفس العملية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_32" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
result </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">find </span><span class="pun">{|</span><span class="pln">item</span><span class="pun">|</span><span class="pln"> item</span><span class="pun">.</span><span class="pln">include</span><span class="pun">?(</span><span class="str">"a"</span><span class="pun">)}</span><span class="pln">
print result</span></pre>

<p>
	ويكون الخرج:
</p>

<pre class="ipsCode">Hammerhead
</pre>

<p>
	ينفذ التابع <code>find</code> التعبير البرمجي الممرر له على كل عنصر داخل المصفوفة، وفي حال كانت القيمة التي يعيدها ذلك التعبير البرمجي الممرر القيمة <code>true</code>، يوقف التابع <code>find</code> عملية المرور ويعيد تلك القيمة مباشرةً، وإذا لم يُعثر على أي عنصر يطابق الشرط المحدد يعيد القيمة <code>nil</code>. يعمل التابع <a href="https://wiki.hsoub.com/Ruby/Array/select" rel="external"><code>select</code></a> بطريقة مشابهة للتابع <code>find</code> ولكنه سيُنشئ مصفوفة جديدة تحتوي على جميع العناصر التي تطابق الشرط المحدد بدلًا من قيمة واحدة فقط على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_34" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
results </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">select </span><span class="pun">{|</span><span class="pln">item</span><span class="pun">|</span><span class="pln"> item</span><span class="pun">.</span><span class="pln">include</span><span class="pun">?(</span><span class="str">"a"</span><span class="pun">)}</span><span class="pln">
print results</span></pre>

<p>
	وتكون النتيجة على النحو التالي:
</p>

<pre class="ipsCode">["Hammerhead", "Great White", "Whale"]
</pre>

<p>
	يعيد التابع <a href="https://wiki.hsoub.com/Ruby/Array/reject" rel="external"><code>reject</code></a> مصفوفةً جديدةً تحتوي على العناصر التي لا تطابق الشرط المحدد، ويمكن استخدامه لتصفية وإزالة العناصر التي لا نرغب بها من المصفوفة، فمثلًا يمكننا إزالة جميع العناصر التي تحتوي على الحرف <code>a</code> من المصفوفة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_36" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
results </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">reject </span><span class="pun">{|</span><span class="pln">item</span><span class="pun">|</span><span class="pln"> item</span><span class="pun">.</span><span class="pln">include</span><span class="pun">?(</span><span class="str">"a"</span><span class="pun">)}</span><span class="pln">
print results</span></pre>

<p>
	ويكون الخرج:
</p>

<pre class="ipsCode">["Tiger"]
</pre>

<p>
	يعيد كلًا من التابعين <code>select</code> و <code>reject</code> مصفوفةً جديدةً دون تغيير قيمة المصفوفة الأصلية، ويمكن استخدام التابعين المقابلين <a href="https://wiki.hsoub.com/Ruby/Array/select!" rel="external"><code>!select</code></a> و <a href="https://wiki.hsoub.com/Ruby/Array/reject!" rel="external"><code>!reject</code></a> في حال أردنا التعديل على قيمة المصفوفة الأصلية؛ أما التابع <code>find_all</code> فهو بديل للتابع <code>select</code>ولكن الفرق بأنه لا يوجد تابع مقابل له للتعديل على قيمة المصفوفة. سنتعرف في الفقرة التالية على طرق ترتيب عناصر المصفوفة.
</p>

<h2>
	ترتيب عناصر المصفوفة
</h2>

<p>
	نحتاج في كثير من الأحيان لترتيب بعض البيانات، مثل ترتيب قائمة من الأسماء أبجديًا، أو ترتيب بعض الأرقام من الأصغر إلى الأكبر، ومن التوابع التي تتعامل مع ترتيب العناصر ضمن المصفوفة هو التابع <a href="https://wiki.hsoub.com/Ruby/Array/reverse" rel="external"><code>reverse</code></a>، الذي يعكس ترتيب العناصر؛ فإذا كانت لدينا قائمة مرتبة من بيانات يمكن استخدام ذلك التابع بمثابة طريقة سريعة لعكس ترتيبها على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_38" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Angel"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">]</span><span class="pln">
reversed_sharks </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">reverse
print reversed_sharks</span></pre>

<p>
	ويكون الخرج:
</p>

<pre class="ipsCode">["Tiger", "Hammerhead", "Great White", "Angel"]
</pre>

<p>
	يعيد التابع <code>reverse</code> مصفوفةً جديدةً دون تغيير قيمة المصفوفة الأصلية، ويمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/reverse!" rel="external"><code>!reverse</code></a> في حال أردنا تغيير قيمة المصفوفة الأصلية. لا يكفي عكس ترتيب عناصر المصفوفة، إذ نحتاج معظم الأحيان لترتيب عناصر غير مرتبة، ويمكن لذلك استخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/sort" rel="external"><code>sort</code></a> لترتيب العناصر ضمن المصفوفة بأي طريقة نريدها، فإذا كانت العناصر ضمن المصفوفة قيم بسيطة مثل <a href="https://academy.hsoub.com/programming/ruby/%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-strings-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2139/" rel="">السلاسل النصية</a> أو الأرقام، فسيرتب التابع <code>sort</code> تلك العناصر مباشرةً:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_40" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pun">]</span><span class="pln">
sorted_sharks </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">sort
print sorted_sharks</span></pre>

<p>
	ويعطي الخرج التالي:
</p>

<pre class="ipsCode">["Angel", "Great White", "Hammerhead", "Tiger"]
</pre>

<p>
	لترتيب البيانات بطريقة مختلفة يجب أن نخبر التابع <code>sort</code> بطريقة فعل ذلك، إذ يمكن تمرير كتلة برمجية للتابع <code>sort</code> الذي سيمرِّر لها عناصر المصفوفة لمقارنتها ويمكن ذلك باستخدام معامل المقارنة <a href="https://wiki.hsoub.com/Ruby/Array/Comparison" rel="external"><code>&lt;=&gt;</code></a>، إليك مثالًا عن ذلك:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_42" style=""><span class="lit">1</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="com"># -1</span><span class="pln">
</span><span class="lit">2</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="com"># 0</span><span class="pln">
</span><span class="lit">2</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="com"># 1</span></pre>

<p>
	يقبل التابع <code>sort</code> في لغة روبي كتلةً برمجيةً يجب أن تعيد إحدى القيم 1- أو 0 أو 1 للتعبير عما إذا كان العنصر الأول يسبق أو يساوي أو يلي العنصر الثاني بالترتيب، وبناءً على تلك المقارنة تُرتب عناصر المصفوفة، وفي ما يلي مقارنة لقيم عناصر المصفوفة وترتيبها تصاعديًا:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_44" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pun">]</span><span class="pln">
sorted_sharks </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">{|</span><span class="pln">a</span><span class="pun">,</span><span class="pln">b</span><span class="pun">|</span><span class="pln"> a </span><span class="pun">&lt;=&gt;</span><span class="pln"> b </span><span class="pun">}</span><span class="pln">
print sorted_sharks</span></pre>

<p>
	يُمثل المتغيران <code>a</code> و <code>b</code> عنصرين من المصفوفة يُقارن بينهما حاليًا، ونتيجة ترتيب المصفوفة هي:
</p>

<pre class="ipsCode">["Angel", "Great White", "Hammerhead", "Tiger"]
</pre>

<p>
	يمكن عكس ترتيب العناصر ضمن عبارة المقارنة بينهما لترتيب العناصر بترتيب عكسي على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_47" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pun">]</span><span class="pln">
sorted_sharks </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">{|</span><span class="pln">a</span><span class="pun">,</span><span class="pln">b</span><span class="pun">|</span><span class="pln"> b </span><span class="pun">&lt;=&gt;</span><span class="pln"> a </span><span class="pun">}</span><span class="pln">
print sorted_sharks</span></pre>

<p>
	ليكون الخرج:
</p>

<pre class="ipsCode">["Tiger", "Hammerhead", "Great White", "Angel"]
</pre>

<p>
	كما لاحظنا، يمكن باستخدام التابع <code>sort</code> ترتيب المصفوفات التي تحتوي على أنواع بسيطة من البيانات، مثل الأعداد الصحيحة، أو العشرية، أو السلاسل النصية، ولكن عندما تحتوي المصفوفة على كائنات أكثر تعقيدًا، سيكون عليك فعل المزيد.
</p>

<p>
	يوضح المثال التالي مصفوفة من قيم من <a href="https://academy.hsoub.com/programming/ruby/%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D8%A7%D9%84%D8%AA%D9%82%D8%B7%D9%8A%D8%B9-hash-tables-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r282/" rel="">نوع hash</a>، وكل hash يمثّل سمك قرش shark:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_49" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
</span><span class="pun">{</span><span class="pln">name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">{</span><span class="pln">name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Great white"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">{</span><span class="pln">name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pun">}</span><span class="pln">
</span><span class="pun">]</span></pre>

<p>
	سيفشل ترتيبها مباشرةً باستخدام <code>sort</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_51" style=""><span class="pln">sharks</span><span class="pun">.</span><span class="pln">sort</span></pre>

<p>
	وعند استدعائه على تلك المصفوفة تظهر الرسالة التالية:
</p>

<pre class="ipsCode">ArgumentError: comparison of Hash with Hash failed
</pre>

<p>
	ولمقارنة تلك القيم يجب أن نخبر التابع <code>sort</code> بطريقة المقارنة بينها. لنرتب تلك الكائنات أبجديًا بحسب خاصية الاسم<code>name:</code> ضمنها على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_53" style=""><span class="pln">sorted_sharks</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">{|</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">|</span><span class="pln"> a</span><span class="pun">[:</span><span class="pln">name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> b</span><span class="pun">[:</span><span class="pln">name</span><span class="pun">]}</span><span class="pln">
print sorted_sharks</span></pre>

<p>
	ليكون الخرج:
</p>

<pre class="ipsCode">[{:name=&gt;"Angel"}, {:name=&gt;"Great white"}, {:name=&gt;"Hammerhead"}]
</pre>

<p>
	يمكن عند ترتيب مصفوفة من الكائنات استخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/sort_by!" rel="external"><code>sort_by</code></a> بدلًا من <code>sort</code>، الذي يستخدم خوارزمية أكثر كفاءة في الترتيب، ويقبل التابع <code>sort_by</code> كتلة برمجية يُمرر إليها وسيط واحد فقط وهو العنصر الحالي في المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_55" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
</span><span class="pun">{</span><span class="pln">name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">{</span><span class="pln">name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Great white"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">{</span><span class="pln">name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pun">}</span><span class="pln">
</span><span class="pun">]</span><span class="pln">

sorted_sharks </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">sort_by</span><span class="pun">{|</span><span class="pln">shark</span><span class="pun">|</span><span class="pln"> shark</span><span class="pun">[:</span><span class="pln">name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
print sorted_sharks</span></pre>

<p>
	يكون الخرج هنا:
</p>

<pre class="ipsCode">[{:name=&gt;"Angel"}, {:name=&gt;"Great white"}, {:name=&gt;"Hammerhead"}]
</pre>

<p>
	يُطبق التابع <code>sort_by</code> خوارزمية ترتيب تدعى تحويل شوارتزيان Schwartzian transform، التي تُستخدم لمقارنة الكائنات بناءً على قيمة محددة منها، وهي خوارزمية أكثر كفاءة من خوارزمية الترتيب ضمن التابع <code>sort</code>؛ إذ يعيد كلًا من التابعين <code>sort</code> و <code>sort_by</code> مصفوفات جديدة دون تغيير قيمة المصفوفة الأصلية، وللتعديل على قيمة المصفوفة الأصلية نستخدم التابعين المقابلين لهما<code>!sort</code> و <code>!sort_by</code>، وقد نحتاج أحيانًا لحذف العناصر المكررة ضمن المصفوفة، وهذا ما سنتعرف عليه في الفقرة التالية.
</p>

<h2>
	إزالة العناصر المكررة من المصفوفة
</h2>

<p>
	قد تحتوي المصفوفات على بعض العناصر المكررة ضمنها، ولإزالة ذلك التكرار يمكن المرور على المصفوفة وإزالة التكرار منها يدويًا، أو يمكن استخدام التابع <code>uniq</code>، الذي يعيد مصفوفةً جديدةً تحتوي قيم المصفوفة نفسها ولكن دون التكرار:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_57" style=""><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">1</span><span class="pun">,</span><span class="lit">5</span><span class="pun">,</span><span class="lit">3</span><span class="pun">].</span><span class="pln">uniq </span><span class="com"># [1,2,3,4,5]</span></pre>

<p>
	سنحاول في المثال التالي دمج مجموعتين من البيانات وسنعالج مشكلة تكرار بعض العناصر في المصفوفة الناتجة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_59" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">]</span><span class="pln">
new_sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">]</span></pre>

<p>
	يمكن الدمج بينها باستخدام معامل الجمع <code>+</code> لنحصل على عنصر مكرر في المصفوفة الناتجة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_61" style=""><span class="pln">sharks </span><span class="pun">+</span><span class="pln"> new_sharks
</span><span class="com"># ["Tiger", "Great White", "Tiger", "Hammerhead"]</span></pre>

<p>
	يمكن استخدام التابع <code>uniq</code> لإزالة التكرار في المصفوفة الناتجة، ولكن بدلًا من ذلك يمكن تجنب ذلك التكرار من الأساس باستخدام معامل الأنبوب <code>|</code> الذي يدمج المصفوفتين دون تكرار العناصر المشتركة بينهما بدلًا من معامل الجمع <code>+</code> وذلك على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_63" style=""><span class="pln">sharks </span><span class="pun">|</span><span class="pln"> new_sharks
</span><span class="com"># ["Tiger", "Great White", "Hammerhead"]</span></pre>

<p>
	يمكن في روبي طرح المصفوفات من بعضها باستخدام معامل الطرح <code>-</code> للحصول على القيم غير المكررة فقط بين كلا المصفوفتين كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_65" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">]</span><span class="pln">
new_sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">]</span><span class="pln">
sharks </span><span class="pun">-</span><span class="pln"> new_sharks </span><span class="com"># ["Great White"]</span></pre>

<p>
	سنتعرف في الفقرة التالية على طرق التعديل على عناصر المصفوفة.
</p>

<h2>
	تعديل عناصر المصفوفة
</h2>

<p>
	يمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/map" rel="external"><code>map</code></a> أو التسمية البديلة له <a href="https://wiki.hsoub.com/Ruby/Array/collect" rel="external"><code>collect</code></a> لتحويل محتويات المصفوفة بتطبيق عملية ما على كل عنصر في المصفوفة، فمثلًا يمكن تنفيذ عمليات حسابية على كل عنصر في المصفوفة وإنشاء مصفوفة جديدة تحتوي على قيمة تلك العملية الحسابية لكل عنصر منها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_67" style=""><span class="pln">numbers </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">8</span><span class="pun">]</span><span class="pln">

</span><span class="com"># square each number</span><span class="pln">
squared_numbers </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="pln">map </span><span class="pun">{|</span><span class="pln">number</span><span class="pun">|</span><span class="pln"> number </span><span class="pun">*</span><span class="pln"> number</span><span class="pun">}</span><span class="pln">

print squared_numbers</span></pre>

<p>
	المتغير <code>squared_numbers</code> هو مصفوفة تحتوي على قيمة مربع كل عدد من المصفوفة الأصلية:
</p>

<pre class="ipsCode">[4, 16, 36, 64]
</pre>

<p>
	يُستخدم التابع <code>map</code> غالبًا في تطبيقات الويب لتحويل عناصر من المصفوفة إلى <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-html-r1702/" rel="">عناصر HTML</a> لعرضها ضمن قائمة منسدلة في الصفحة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_69" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">

options </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">map </span><span class="pun">{|</span><span class="pln">shark</span><span class="pun">|</span><span class="pln"> </span><span class="str">"&lt;option&gt;#{shark}&lt;/option&gt;"</span><span class="pun">}</span><span class="pln">

print options</span></pre>

<p>
	تحتوي المصفوفة الجديدة <code>options</code> على كل عنصر من المصفوفة الأصلية محاطًا بالوسم <code>&lt;option&gt;&lt;/option&gt;</code>:
</p>

<pre class="ipsCode">["&lt;option&gt;Hammerhead&lt;/option&gt;", "&lt;option&gt;Great White&lt;/option&gt;", "&lt;option&gt;Tiger&lt;/option&gt;", "&lt;option&gt;Whale&lt;/option&gt;"]
</pre>

<p>
	يعيد التابع <code>map</code> مصفوفةً بالقيم الجديدة دون التعديل على المصفوفة الأصلية، ويمكن باستخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/!map" rel="external"><code>!map</code></a> تعديل قيمة المصفوفة الأصلية، ويمكن استخدام التسمية البديلة للتابع <a href="https://wiki.hsoub.com/Ruby/Array/collect" rel="external"><code>collect</code></a> بنفس الطريقة، ويُفضّل اعتماد أحد هذين التابعين لتوحيد الاستخدام ضمن الشيفرة البرمجية، وبما أن التابع <code>map</code> يعيد مصفوفةً جديدة فيمكن تحويل أو تعديل عناصر تلك المصفوفة الجديدة مجددًا أو تحويلها مثلًا إلى سلسلة نصية، وسنتعرف على ذلك في الفقرة التالية.
</p>

<h2>
	تحويل المصفوفة إلى سلسلة نصية
</h2>

<p>
	تحتوي جميع الكائنات في لغة روبي على التابع <a href="https://wiki.hsoub.com/Ruby/Array/to_s" rel="external"><code>to_s</code></a> والذي يحوّل أي كائن إلى سلسلة نصية، وهذا ما يستخدمه التابع <code>print</code> داخليًا لطباعة الكائنات المٌمررة له على الشاشة. لنختبر ذلك على المصفوفة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_71" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span></pre>

<p>
	ينتج عن استدعاء التابع <code>to_s</code> على تلك المصفوفة السلسلة النصية التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_73" style=""><span class="str">"[\"Hammerhead\", \"Great White\", \"Tiger\", \"Whale\"]"</span></pre>

<p>
	قد تفيدنا تلك العملية في معاينة قيم المتغيرات أثناء تطوير البرامج.
</p>

<p>
	يوجد أيضًا التابع <a href="https://wiki.hsoub.com/Ruby/Array/join" rel="external"><code>join</code></a>، الذي يحوّل المصفوفة إلى سلسلة نصية بطريقة أخرى عبر دمج تلك العناصر بجانب بعضها بعضًا، ويقبل وسيطًا هو سلسلة نصية ستفصل بين تلك العناصر مثل المسافة الفارغة. لنختبر ذلك بتحويل المصفوفة السابقة إلى سلسلة نصية على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_75" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
result </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="str">" "</span><span class="pun">)</span><span class="pln">
print result</span></pre>

<p>
	لتكون النتيجة:
</p>

<pre class="ipsCode">Hammerhead Great White Tiger Whale
</pre>

<p>
	يمكن بدلًا من المسافة الفارغة فصل القيم بفاصلة ومسافة بين العناصر بتمريرها للتابع كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_77" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
result </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="str">", "</span><span class="pun">)</span><span class="pln">
print result</span></pre>

<p>
	ويكون الخرج في هذه الحالة:
</p>

<pre class="ipsCode">Hammerhead, Great White, Tiger, Whale
</pre>

<p>
	وإذا لم نمرر أي وسيط للتابع <a href="https://wiki.hsoub.com/Ruby/Array/join" rel="external"><code>join</code></a>، سيعيد سلسلةً نصيةً تحتوي على العناصر الموجودة في المصفوفة دون فواصل بينها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_80" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
result </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">join
print result</span></pre>

<p>
	وتكون النتيجة على النحو التالي:
</p>

<pre class="ipsCode">HammerheadGreat WhiteTigerWhale
</pre>

<p>
	يمكن استخدام التابع <code>join</code> مع التابع <code>map</code> لتحويل مصفوفة من البيانات إلى نتيجة يمكن عرضها على الشاشة، إذ يحوّل التابع <code>map</code> كل عنصر من المصفوفة إلى الشكل الجديد، ثم يدمج التابع <code>join</code> تلك القيم في سلسلة نصية يمكن طباعتها على الشاشة، إذ يمكننا مثلًا تحويل العناصر إلى عناصر HTML كما فعلنا سابقًا ثم دمجها باستخدام التابع <code>join</code> في سلسلة نصية يفصل بينها أسطر جديدة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_82" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
options </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">map </span><span class="pun">{|</span><span class="pln">shark</span><span class="pun">|</span><span class="pln"> </span><span class="str">"&lt;option&gt;#{shark}&lt;/option&gt;"</span><span class="pun">}</span><span class="pln">
output </span><span class="pun">=</span><span class="pln"> options</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="str">"\n"</span><span class="pun">)</span><span class="pln">
print output</span></pre>

<p>
	ليعطي الخرج التالي:
</p>

<pre class="ipsCode">&lt;option&gt;Hammerhead&lt;/option&gt;
&lt;option&gt;Great White&lt;/option&gt;
&lt;option&gt;Tiger&lt;/option&gt;
&lt;option&gt;Whale&lt;/option&gt;
</pre>

<p>
	أحيانًا نحتاج لحساب قيمة إجمالية من عناصر المصفوفة أو تنفيذ عملية ما عليها ينتج منها قيمة واحدة، وسنتعرف على طريقة ذلك في الفقرة التالية.
</p>

<h2>
	تقليص المصفوفة إلى قيمة واحدة
</h2>

<p>
	يمكن حساب قيمة معينة من عناصر المصفوفة بالمرور على كل عنصر منها باستخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/each" rel="external"><code>each</code></a> ودمجه في النتيجة النهائية، مثل حساب المجموع الكلي للأرقام ضمن المصفوفة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_84" style=""><span class="pln">result </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">each </span><span class="pun">{|</span><span class="pln">num</span><span class="pun">|</span><span class="pln"> result </span><span class="pun">+=</span><span class="pln"> num</span><span class="pun">}</span><span class="pln">
print result</span></pre>

<p>
	سيكون الخرج:
</p>

<pre class="ipsCode">6
</pre>

<p>
	يمكننا بدلًا من ذلك استخدام التابع <code>reduce</code>، الذي يُنفذ عمليةً معينة على كل عنصر من عناصر المصفوفة مع تمرير قيمة الدمج الحالية مع العنصر الحالي إلى الكتلة البرمجية المٌمررة له، إذ يقبل التابع <code>reduce</code> وسيطًا وهو القيمة الابتدائية للنتيجة ويستخدم الكتلة البرمجة المُمررة له والتي سيُمرر لها متغيرين هما قيمة الدمج الحالية والعنصر الحالي، ويمكن داخل الكتلة البرمجية تحديد طريقة إضافة العنصر الحالي إلى النتيجة النهائية، فمثلًا لجمع عناصر المصفوفة يمكن تمرير القيمة 0 مثل قيمة ابتدائية للنتيجة ثم إضافة قيمة كل عنصر من المصفوفة إلى النتيجة المُمررة داخل الكتلة البرمجية على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_86" style=""><span class="pln">output </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">].</span><span class="pln">reduce</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{|</span><span class="pln">result</span><span class="pun">,</span><span class="pln"> current</span><span class="pun">|</span><span class="pln"> result </span><span class="pun">+=</span><span class="pln"> current </span><span class="pun">}</span><span class="pln">
print output</span></pre>

<p>
	لتكون النتيجة في الخرج:
</p>

<pre class="ipsCode">6
</pre>

<p>
	وفي حال كانت النتيجة الابتدائية هي صفر 0، يمكننا اختصار تمريرها مثل وسيط للتابع وتمرير الكتلة البرمجية له فقط، إذ ستكون القيمة الابتدائية هي قيمة أول عنصر من المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_88" style=""><span class="pln">output </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">].</span><span class="pln">reduce </span><span class="pun">{|</span><span class="pln">result</span><span class="pun">,</span><span class="pln"> current</span><span class="pun">|</span><span class="pln"> result </span><span class="pun">+=</span><span class="pln"> current </span><span class="pun">}</span><span class="pln">
print output</span></pre>

<p>
	ويكون الخرج:
</p>

<pre class="ipsCode">6
</pre>

<p>
	يمكن تحديد تابع ثنائي binary أو تابع عادي على كائن واحد يقبل كائنًا آخر مثل وسيط له ليٌستدعى على كل عنصر من عناصر المصفوفة، ويستخدم التابع <code>reduce</code> نتيجة ذلك الاستدعاء لإنشاء قيمة واحدة تدل على النتيجة النهائية، وعند جمع عددين مثلًا <code>2 + 2</code> في روبي، يٌفهم ذلك على أنه استدعاء لتابع الجمع <code>+</code> على كائن العدد 2 كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_90" style=""><span class="lit">2.</span><span class="pun">+(</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="com"># 4</span></pre>

<p>
	يمكن استخدام الصيغة <code>2 + 2</code> في روبي لتسهيل القراءة لتلك العبارة البرمجية، وينتج عنها داخليًا في اللغة استدعاء لتابع الجمع <code>+</code> على العدد 2، وبما أن التابع <code>reduce</code> يسمح بتحديد تابع ثنائي لاستدعائه على كل عنصر من عناصر المصفوفة مع النتيجة، فيمكن تمرير اسمه على شكل رمز، مثل تمرير الرمز <code>+:</code> للتابع <code>reduce</code> مثلًا لاستدعاء تابع الجمع على كل عنصر لجمع عناصر المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_92" style=""><span class="pln">output </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">reduce</span><span class="pun">(:+)</span><span class="pln">
print output</span></pre>

<p>
	لتكون النتيجة في الخرج:
</p>

<pre class="ipsCode">6
</pre>

<p>
	يمكن استخدام التابع <code>reduce</code> لتنفيذ العديد من العمليات على عناصر المصفوفة، إذ يمكن استخدامه لتحويل تلك القيم، كما يمكن استخدامه لتقليص قيم المصفوفة للحصول على قيمة مفردة، ولكن لا توجد قاعدة تنص على أن القيمة المفردة ليست بمصفوفة جديدة.
</p>

<p>
	إذا كان لدينا قائمة من القيم التي نريد تحويلها إلى أعداد صحيحة، ولكن نريد فقط اختيار القيم التي يمكن تحويلها إلى أعداد صحيحة، فيمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/reject" rel="external"><code>reject</code></a> لإزالة القيم غير العددية، ثم استخدام التابع <code>map</code> لتحويل القيم المتبقية إلى أعداد صحيحة، أو يمكن فعل كل ذلك في خطوة واحدة باستخدام التابع <code>reduce</code> باستخدام مصفوفة فارغة مثل قيمة ابتدائية ثم نحول القيمة الحالية إلى عدد صحيح باستخدام التابع <code>Integer</code> في الكتلة البرمجية المُمررة، وإذا كانت القيمة غير قابلة للتحويل إلى عدد صحيح سيرمي التابع <code>Integer</code> استثناء يمكننا التقاطه وتبديل القيمة الحالية بالقيمة <code>nil</code>، ثم إضافة القيمة الحالية إلى مصفوفة النتيجة فقط إذا لم تكن <code>nil</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9547_94" style=""><span class="pln">values </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"1"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"2"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"a"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"3"</span><span class="pun">]</span><span class="pln">
integers </span><span class="pun">=</span><span class="pln"> values</span><span class="pun">.</span><span class="pln">reduce</span><span class="pun">([])</span><span class="pln"> </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">array</span><span class="pun">,</span><span class="pln"> current</span><span class="pun">|</span><span class="pln">
val </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Integer</span><span class="pun">(</span><span class="pln">current</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">rescue</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
array</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="pln">val</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">unless</span><span class="pln"> val</span><span class="pun">.</span><span class="kwd">nil</span><span class="pun">?</span><span class="pln">
array
</span><span class="kwd">end</span><span class="pln">
print integers</span></pre>

<p>
	سيكون الخرج:
</p>

<pre class="ipsCode">[1,2,3]
</pre>

<p>
	كما لاحظنا، يُستخدم التابع <code>reduce</code> في حال كانت النتيجة النهائية من المصفوفة قيمة مفردة أو مصفوفة جديدة بطول مختلف عن المصفوفة الأصلية.
</p>

<h2>
	الخاتمة
</h2>

<p>
	تعرفنا في هذا المقال على العديد من الطرق للتعامل مع المصفوفات، إذ تعلمنا كيفية الوصول إلى عناصرها والبحث واستخراج بعض القيم منها وترتيب العناصر وتحويل البيانات ضمنها وإنشاء مصفوفات وسلاسل نصية وقيمة مجموع كلي جديدة. تفيد كل تلك المفاهيم في حل العديد من المشاكل البرمجية باستخدام لغة روبي وهي من أهم المهارات التي يجب على المبرمج اكتسابها.
</p>

<p>
	لمزيد من التفصيل، ارجع إلى صفحة <a href="https://wiki.hsoub.com/Ruby/Array" rel="external">النوع Array</a> في موسوعة حسوب.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-use-array-methods-in-ruby" rel="external nofollow">How To Use Array Methods in Ruby</a> لصاحبه Brian Hogan.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-arrays-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2141/" rel="">التعامل مع المصفوفات في لغة روبي</a>
	</li>
	<li>
		مقال <a href="https://academy.hsoub.com/programming/ruby/%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-strings-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2139/" rel="">السلاسل النصية في لغة روبي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r1726/" rel="">دليلك الشامل إلى أنواع البيانات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2142</guid><pubDate>Mon, 30 Oct 2023 13:01:01 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x645;&#x635;&#x641;&#x648;&#x641;&#x627;&#x62A; Arrays &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-arrays-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2141/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_10/----.png.aefbfe4fdaec36410ed1bf3e5811ed24.png" /></p>
<p>
	المصفوفة array هي شكل من أشكال <a href="https://academy.hsoub.com/programming/general/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r1726/" rel="">البيانات</a> التي توفرها معظم لغات البرمجة والتي تسمح بتخزين عدة قيم تدعى عناصر معًا ضمن متغير واحد، ويمكن لهذه العناصر أن تكون من أنواع مختلفة من البيانات، مثل الأرقام و<a href="https://academy.hsoub.com/programming/ruby/%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-strings-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2139/" rel="">السلاسل النصية</a> وغيرها من كائنات <a href="https://academy.hsoub.com/programming/ruby/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-ruby-r636/" rel="">روبي</a>. سنتعرف في هذا المقال على طرق إنشاء المصفوفات والوصول إلى القيم التي تحتويها، وإضافة وتعديل وحذف العناصر من المصفوفة، وطريقة المرور على عناصر المصفوفة، إذ تُعد المصفوفة في روبي كائنات مع توابعها الممكن استدعاؤها والاستفادة منها في التعامل مع عناصر المصفوفة.
</p>

<h2>
	إنشاء مصفوفة
</h2>

<p>
	في حال كان لدينا عدة قيم نحتاج التعامل معها ضمن البرنامج يمكننا تخزين كل منها في متغير خاص على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_8" style=""><span class="pln">shark1 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pln">
shark2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pln">
shark3 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Tiger"</span></pre>

<p>
	ولكن سنحتاج بتلك الطريقة لاختيار اسم متغير لكل قيمة منها، وفي حال كانت القيم كثيرة سيصبح الأمر صعبًا، وإذا أردنا إضافة قيمة جديدة إليها يجب تعريف متغير جديد وتذكُّر اسمه لاحقًا. هنا تأتي المصفوفات لحل تلك المشكلة عبر تخزين كل تلك القيم ضمن متغير واحد فقط. لإنشاء مصفوفة في روبي يمكن كتابة قيم العناصر ضمن أقواس معقوفة <code>[]</code> والفصل بينها بفواصل <code>,</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_10" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">]</span></pre>

<p>
	بدلًا من إنشاء ثلاثة متغيرات منفصلة أصبح لدينا الآن متغير واحد يحتوي على جميع القيم، ولإضافة قيمة جديدة للمصفوفة يمكن إضافتها مباشرةً دون الحاجة لإنشاء متغير جديد.
</p>

<p>
	يمكن طباعة كامل المصفوفة باستخدام التابع <code>print</code>، الذي سيعرض محتويات المصفوفة كما يلي:
</p>

<pre class="ipsCode">print sharks
</pre>

<p>
	ليكون الخرج على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_12" style=""><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">]</span></pre>

<p>
	توفر لغة روبي طريقةً مختصرةً لإنشاء مصفوفة يكون فيها كل مُدخل هو كلمة واحدة، وذلك بكتابة الكلمات بين القوسين في الصيغة التالية <code>{}w%</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_14" style=""><span class="pln">days </span><span class="pun">=</span><span class="pln"> </span><span class="pun">%</span><span class="pln">w</span><span class="pun">{</span><span class="typ">Monday</span><span class="pln"> </span><span class="typ">Tuesday</span><span class="pln"> </span><span class="typ">Wednesday</span><span class="pln"> </span><span class="typ">Thursday</span><span class="pln"> </span><span class="typ">Friday</span><span class="pln"> </span><span class="typ">Saturday</span><span class="pln"> </span><span class="typ">Sunday</span><span class="pun">}</span></pre>

<p>
	وسينتج عنها مصفوفة من الكلمات كما لو أننا عرفناها يدويًا ضمن أقواس معقوفة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_16" style=""><span class="pln">days </span><span class="pun">=</span><span class="pln">  </span><span class="pun">[</span><span class="str">"Monday"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tuesday"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Wednesday"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Thursday"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Friday"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Saturday"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Sunday"</span><span class="pun">]</span></pre>

<p>
	ونلاحظ عدم الحاجة لاستخدام <a href="https://academy.hsoub.com/questions/2955-%D9%85%D8%A7-%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%B9%D9%84%D8%A7%D9%85%D8%A9-%D8%A7%D9%84%D8%A7%D9%82%D8%AA%D8%A8%D8%A7%D8%B3-%D8%A7%D9%84%D9%85%D9%81%D8%B1%D8%AF%D8%A9-%D9%88%D8%A7%D9%84%D9%85%D8%B2%D8%AF%D9%88%D8%AC%D8%A9-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A%D8%9F/?sortby=date" rel="">علامات الاقتباس</a> لتعريف تلك الكلمات ضمن الصيغة <code>{}w%</code>، ولسنا مضطرين لتخزين عناصر من نفس النوع ضمن المصفوفة، ففي روبي يمكن للمصفوفات أن تحتوي على أي نوع من القيم بما في ذلك مصفوفات أخرى، وفيما يلي مثال على مصفوفة تحتوي على سلسلة نصية والقيمة <code>nil</code> وعدد صحيح ومصفوفة من السلاسل النصية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_18" style=""><span class="pln">record </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="str">"Sammy"</span><span class="pun">,</span><span class="pln">
    null</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">7</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">
        </span><span class="str">"another"</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"array"</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">]</span><span class="pln">
</span><span class="pun">]</span></pre>

<p>
	سنتعرف في الفقرة التالية على كيفية الوصول إلى البيانات المخزنة ضمن المصفوفات.
</p>

<h2>
	الوصول لعناصر المصفوفة
</h2>

<p>
	للوصول إلى عنصر محدد ضمن المصفوفة يمكننا الإشارة إلى رقم الفهرس لذلك العنصر، أي ترتيب موقعه ضمن المصفوفة، إذ تبدأ الفهارس في روبي ومعظم <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a> الأخرى من الرقم صفر، فمثلًا للوصول إلى العنصر الأول من المصفوفة يمكننا تمرير رقم الفهرس له بعد اسم المتغير وبين الأقواس المعقوفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_21" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">]</span></pre>

<p>
	تحتوي المصفوفة <code>sharks</code> على ثلاثة عناصر، ورقم الفهرس لكل عنصر منها على النحو التالي:
</p>

<table>
	<thead>
		<tr>
			<th>
				2
			</th>
			<th>
				1
			</th>
			<th>
				0
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				Tiger
			</td>
			<td>
				Great White
			</td>
			<td>
				Hammerhead
			</td>
		</tr>
	</tbody>
</table>

<p>
	العنصر الأول في المصفوفة وهو <code>Hammerhead</code> له الفهرس رقم 0، أما العنصر الأخير في المصفوفة وهو <code>Tiger</code> له الفهرس رقم 2، إذ وعلى عكس طريقة العد التقليدية التي تبدأ بالرقم 1، نلاحظ أن الفهارس تبدأ من الصفر، لذا يجب الاعتياد على ذلك عند التعامل مع المصفوفات لتجنب الأخطاء. يمكن معرفة عدد العناصر الموجودة في المصفوفة باستخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/length" rel="external"><code>length</code></a> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_23" style=""><span class="pln">sharks</span><span class="pun">.</span><span class="pln">length</span></pre>

<p>
	ليكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">3
</pre>

<p>
	على الرغم من أن فهارس المصفوفة <code>sharks</code> تبدأ من 0 وتنتهي بالفهرس 2، إلا أن تابع طول المصفوفة <code>length</code> يعيد عدد العناصر الموجودة في المصفوفة والذي يساوي 3، ولا علاقة له برقم الفهرس للعناصر.
</p>

<p>
	<em>ملاحظة:</em> يمكنك التفكير في الفهرس على أنه إزاحة offset، أي عدد الأماكن من بداية المصفوفة، إذ يكون العنصر الأول في المقدمة وبالتالي بدون إزاحة، أي سيكون الفهرس 0، أما العنصر الثاني فهو على بُعد عنصر واحد من بداية المصفوفة، لذلك ستكون إزاحته بمقدار 1 وقيمة الفهرس 1.
</p>

<p>
	لمعرفة رقم الفهرس لعنصر محدد ضمن المصفوفة مثل العنصر<code>Tiger</code> يمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/index" rel="external"><code>()index</code></a> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_25" style=""><span class="pln">print sharks</span><span class="pun">.</span><span class="pln">index</span><span class="pun">(</span><span class="str">"Tiger"</span><span class="pun">)</span></pre>

<p>
	ليعطي الخرج التالي:
</p>

<pre class="ipsCode">2
</pre>

<p>
	يعيد هذا التابع رقم الفهرس لأول عنصر من المصفوفة يحتوي على النص المحدد، وإذا لم يُعثر على عنصر مطابق لتلك القيمة فسيعيد التابع القيمة <code>nil</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_27" style=""><span class="pln">print sharks</span><span class="pun">.</span><span class="pln">index</span><span class="pun">(</span><span class="str">"Whale"</span><span class="pun">)</span></pre>

<p>
	سيكون هنا الخرج:
</p>

<pre class="ipsCode">nil
</pre>

<p>
	للحصول على آخر عنصر من المصفوفة يمكن استخدام رقم الفهرس السالب 1-:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_29" style=""><span class="pln">print sharks</span><span class="pun">[-</span><span class="lit">1</span><span class="pun">]</span></pre>

<p>
	وسيكون الخرج كما يلي:
</p>

<pre class="ipsCode">"Tiger"
</pre>

<p>
	ويوجد أيضًا التابعين <a href="https://wiki.hsoub.com/Ruby/Array/first" rel="external"><code>first</code></a> و <a href="https://wiki.hsoub.com/Ruby/Array/last" rel="external"><code>last</code></a> في روبي للحصول على أول وآخر عنصر من المصفوفة دون الحاجة إلى استخدام رقم الفهرس لها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_31" style=""><span class="pln">puts sharks</span><span class="pun">.</span><span class="pln">first
puts sharks</span><span class="pun">.</span><span class="pln">last</span></pre>

<p>
	ويكون الخرج:
</p>

<pre class="ipsCode">"Hammerhead"
"Tiger"
</pre>

<p>
	وعند محاولة الوصول إلى فهرس غير موجود:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_33" style=""><span class="pln">sharks</span><span class="pun">[</span><span class="lit">10</span><span class="pun">]</span></pre>

<p>
	سينتج عن ذلك القيمة <code>nil</code>:
</p>

<pre class="ipsCode">nil
</pre>

<p>
	يمكن أن تحتوي المصفوفات على مصفوفات أخرى ضمنها لينتج من ذلك مصفوفات متداخلة nested arrays يمكن الاستفادة من هذا الشكل من البيانات لتمثيل البيانات ثنائية الأبعاد في البرنامج، ويمكنك الاطلاع على مزيدٍ من المعلومات عن المصفوفات وأنواعها من خلال المقال <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-arrays-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r280/" rel="">المصفوفات Arrays في روبي</a>، وفيما يلي مثال على مصفوفة متداخلة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_35" style=""><span class="pln">nested_array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">
        </span><span class="str">"salmon"</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"halibut"</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">],</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">
        </span><span class="str">"coral"</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"reef"</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">]</span><span class="pln">
</span><span class="pun">]</span></pre>

<p>
	للوصول إلى العناصر الموجودة ضمن مصفوفة متداخلة يجب إضافة رقم فهرس إضافي يتوافق مع المصفوفة الداخلية، فمثلًا يمكن الوصول إلى القيمة <code>coral</code> من المصفوفة السابقة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_37" style=""><span class="pln">print nested_array</span><span class="pun">[</span><span class="lit">1</span><span class="pun">][</span><span class="lit">0</span><span class="pun">];</span></pre>

<p>
	ليكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">coral
</pre>

<p>
	نستخرج في هذا المثال العنصر الثاني أولًا من المصفوفة عبر رقم الفهرس 1 من المتغير <code>nested_array</code>، وهو عنصر المصفوفة <code>["coral", "reef"]</code>، ثم نستخرج العنصر الأول من هذه المصفوفة عبر رقم الفهرس 0 لنحصل بذلك على القيمة المطلوبة <code>"coral"</code>.
</p>

<p>
	سنتعرف في الفقرة التالية على طريقة إضافة عناصر إلى المصفوفة.
</p>

<h2>
	إضافة عناصر إلى المصفوفات
</h2>

<p>
	لنعود إلى المصفوفة السابقة <code>sharks</code>، التي تحتوي على ثلاثة عناصر تبدأ من رقم الفهرس 0 إلى 2:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_39" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">]</span></pre>

<p>
	لإضافة عنصر جديد إلى تلك المصفوفة، يمكن تعيين قيمة للفهرس الذي يلي آخر عنصر منها والذي في هذه الحالة هو 3 كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_41" style=""><span class="pln">sharks</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">;</span><span class="pln">

print sharks</span></pre>

<p>
	ليكون الخرج على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_43" style=""><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span></pre>

<p>
	قد يؤدي استخدام هذه الطريقة إلى حدوث أخطاء، فإذا أضفنا عنصرًا إلى رقم فهرس ما أكبر من ذلك فسيؤدي ذلك لإضافة العنصر <code>nil</code> داخل المصفوفة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_45" style=""><span class="pln">sharks</span><span class="pun">[</span><span class="lit">5</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sand"</span><span class="pun">;</span><span class="pln">

print sharks</span><span class="pun">;</span></pre>

<p>
	ويكون الخرج في هذه الحالة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_48" style=""><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">nil</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Sand"</span><span class="pun">]</span></pre>

<p>
	وعند محاولة الوصول إلى قيمة ذلك العنصر الزائد سنحصل على القيمة <code>nil</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_50" style=""><span class="pln">sharks</span><span class="pun">[</span><span class="lit">4</span><span class="pun">]</span></pre>

<p>
	سيكون الخرج:
</p>

<pre class="ipsCode">nil
</pre>

<p>
	يمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/push" rel="external"><code>push</code></a> لتجنب هذه الأخطاء، إذ يضيف هذا التابع عنصرًا إلى نهاية المصفوفة دون مشاكل:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_52" style=""><span class="pln">sharks</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="str">"Thresher"</span><span class="pun">)</span><span class="pln">
print sharks</span></pre>

<p>
	وعندها سيكون الخرج:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_54" style=""><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">nil</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Thresher"</span><span class="pun">]</span></pre>

<p>
	يمكن أيضًا استخدام الصيغة <a href="https://wiki.hsoub.com/Ruby/Array/append_operator" rel="external"><code>&gt;&gt;</code></a> بدلًا من التابع <code>push</code> لإضافة عنصر إلى نهاية المصفوفة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_56" style=""><span class="pln">sharks </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="str">"Bullhead"</span></pre>

<p>
	ويكون الخرج:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_58" style=""><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">nil</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Thresher"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Bullhead"</span><span class="pun">]</span></pre>

<p>
	نستخدم التابع <a href="https://wiki.hsoub.com/Ruby/Array/unshift" rel="external"><code>()unshift</code></a> لإضافة عنصر إلى بداية المصفوفة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_60" style=""><span class="pln">sharks</span><span class="pun">.</span><span class="pln">unshift</span><span class="pun">(</span><span class="str">"Angel"</span><span class="pun">)</span><span class="pln">
print sharks</span></pre>

<p>
	ليعطي الخرج التالي:
</p>

<pre class="ipsCode">["Angel", "Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", "Bullhead"]
</pre>

<p>
	سنتعرف في الفقرة التالية على طريقة إزالة عناصر من المصفوفة.
</p>

<h2>
	إزالة العناصر من المصفوفات
</h2>

<p>
	يمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/delete" rel="external"><code>delete</code></a> أو <a href="https://wiki.hsoub.com/Ruby/Array/delete_at" rel="external"><code>delete_at</code></a> لإزالة عنصر محدد من المصفوفة. لنختبر ذلك بإزالة العنصر الفارغ داخلها والذي أنشأناه عن طريق الخطأ، ونبدأ بالعثور على موضعه في المصفوفة باستخدام التابع <code>index</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_63" style=""><span class="pln">print sharks</span><span class="pun">.</span><span class="pln">index</span><span class="pun">(</span><span class="kwd">nil</span><span class="pun">)</span></pre>

<p>
	والذي يعطينا الخرج التالي:
</p>

<pre class="ipsCode">4
</pre>

<p>
	ثم نستخدم التابع <code>delete_at</code> لإزالة ذلك صاحب الفهرس رقم 4 ونطبع المصفوفة لنتأكد:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_65" style=""><span class="pln">sharks</span><span class="pun">.</span><span class="pln">delete_at</span><span class="pun">(</span><span class="lit">4</span><span class="pun">)</span><span class="pln">
print sharks</span></pre>

<p>
	سيكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">["Angel", "Hammerhead", "Great White", "Tiger", "Whale", "Thresher", "Bullhead"]
</pre>

<p>
	يزيل التابع <code>delete</code> العناصر التي تتطابق مع القيمة التي تُمرّر له. لنختبر استخدامه بإزالة العنصر <code>Whale</code> من المصفوفة السابقة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_67" style=""><span class="pln">sharks</span><span class="pun">.</span><span class="pln">delete</span><span class="pun">(</span><span class="str">"Whale"</span><span class="pun">)</span><span class="pln">
print sharks</span><span class="pun">;</span></pre>

<p>
	ويكون الخرج في هذه الحالة:
</p>

<pre class="ipsCode">["Angel", "Hammerhead", "Great White", "Tiger", "Thresher", "Bullhead"]
</pre>

<p>
	يزيل التابع <code>delete</code> جميع القيم المطابقة للقيمة التي نمررها له، لذا إذا كانت المصفوفة تحتوي على عناصر مكررة فستُزال جميعها، وبالمقابل يتيح التابع <code>pop</code> إزالة آخر عنصر من المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_69" style=""><span class="pln">sharks</span><span class="pun">.</span><span class="pln">pop
print sharks</span><span class="pun">;</span></pre>

<p>
	ليكون الخرج كما يلي:
</p>

<pre class="ipsCode">["Angel", "Hammerhead", "Great White", "Tiger", "Thresher"]
</pre>

<p>
	نلاحظ إزالة العنصر <code>Bullhead</code>، وهو آخر عنصر في المصفوفة. لإزالة أول عنصر من المصفوفة يمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/Array/shift" rel="external"><code>shift</code></a> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_72" style=""><span class="pln">sharks</span><span class="pun">.</span><span class="pln">shift
print sharks</span></pre>

<p>
	ليكون الخرج:
</p>

<pre class="ipsCode">["Hammerhead", "Great White", "Tiger", "Thresher"]
</pre>

<p>
	نلاحظ إزالة العنصر <code>Angel</code> من بداية المصفوفة، ويمكن استخدام التابعين <a href="https://wiki.hsoub.com/Ruby/Array/pop" rel="external"><code>pop</code></a> و <a href="https://wiki.hsoub.com/Ruby/Array/shift" rel="external"><code>shift</code></a> لإزالة العناصر من بداية ونهاية المصفوفة كما لاحظنا، ويفضل استخدام التابع <code>pop</code> عند الحاجة لأن حذف العنصر من نهاية المصفوفة لن يؤثر على رقم الفهرس لباقي العناصر.
</p>

<p>
	تعدل كلًا من التوابع <code>delete_at</code> و <code>pop</code> و <code>shift</code> على قيمة المصفوفة الأصلية وتعيد العنصر المحذوف:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_74" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
deleted_at_element </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">delete_at</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln">
popped_element </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">pop

puts </span><span class="str">"Deleted_at element: #{deleted_at_element}"</span><span class="pln">
puts </span><span class="str">"Popped element: #{popped_element}"</span><span class="pln">

puts </span><span class="str">"Remaining array: #{sharks}"</span></pre>

<p>
	وسيكون الخرج:
</p>

<pre class="ipsCode">Deleted_at element: Great White
Popped element: Whale
Remaining array: ["Hammerhead", "Tiger"]
</pre>

<p>
	بعد أن تعرفنا على طرق إزالة العناصر من المصفوفة، سنتعرف في الفقرة التالية على طريقة التعديل على قيمة عنصر من المصفوفة.
</p>

<h2>
	تعديل عناصر موجودة في المصفوفات
</h2>

<p>
	يمكن تحديث قيمة عنصر من المصفوفة عن طريق تعيين قيمة جديدة لفهرس ذلك العنصر باستخدام معامل الإسناد تمامًا كما نُعرف المتغيرات العادية. تحتوي المصفوفة التالية على العنصر <code>"Hammerhead"</code> في الفهرس رقم 0، لنحاول تعديل قيمة ذلك العنصر إلى القيمة <code>"Angel"</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_76" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
sharks</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pln">
print sharks</span><span class="pun">;</span></pre>

<p>
	سيكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">["Angel", "Great White", "Tiger", "Whale"]
</pre>

<p>
	يمكن التأكد من تعديل قيمة ذلك العنصر بالبحث عن القيمة الجديدة باستخدام التابع <code>index</code> لنلاحظ أن القيمة الجديدة موجودة في نفس المكان. سنتعرف في الفقرة التالية على طريقة المرور على عناصر المصفوفة.
</p>

<h2>
	المرور على عناصر المصفوفة
</h2>

<p>
	توفر لغة روبي العديد من الطرق للمرور على عناصر المصفوفة، ويختلف التابع المُستخدم بحسب الهدف الذي نريده. لنبدأ بالمرور على عناصر المصفوفة وطباعة قيمة كل منها وذلك باستخدام الصيغة<code>for..in</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_78" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> shark </span><span class="kwd">in</span><span class="pln"> sharks </span><span class="kwd">do</span><span class="pln">
  puts shark
</span><span class="kwd">end</span></pre>

<p>
	تعيّن روبي قيمة كل عنصر في المتغير المحلي <code>shark</code>، ويمكنك بعد ذلك طباعة قيمة ذلك العنصر باستخدام التابع <code>puts</code>. على الرغم من إمكانية استخدام الحلقة التكرارية <code>for..in</code> للمرور على عناصر المصفوفة، إلا أن المصفوفات في لغة روبي هي كائنات ويتوفر ضمنها التابع <a href="https://wiki.hsoub.com/Ruby/Array/each" rel="external"><code>each</code></a>، الذي يعمل بنفس طريقة الحلقة التكرارية <code>for..in</code> ولكن بصيغة مختلفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_80" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">each </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">shark</span><span class="pun">|</span><span class="pln">
  puts shark
</span><span class="kwd">end</span></pre>

<p>
	يستخدم التابع <code>each</code> صيغةً تتكرر كثيرًا في لغة روبي، إذ يأخذ التابع كتلة block مثل وسيط، ويُقصد بالكتلة هنا شيفرة برمجية ستنفذ لاحقًا في سياق التابع. ستُنفذ في مثالنا السابق العبارة البرمجية <code>puts shark</code>، أما الكلمة <code>shark</code> المحاطة بعلامات الأنبوب <code>|</code> هي المتغير المحلي الذي يمثل العنصر الحالي في المصفوفة، إذ تسنِد لغة روبي قيمة العنصر الحالي إلى هذا المتغير وتنفذ بعدها التعبير الموجود ضمن الكتلة، ويكرّر التابع <code>each</code> هذه العملية لكل عنصر من عناصر المصفوفة، ويكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">Hammerhead
Great White
Tiger
Whale
</pre>

<p>
	يمكن استخدام الصيغة المختصرة ضمن الأقواس المعقوصة curly braces <code>{}</code> بدلًا من كلمتي <code>do</code> و <code>end</code> إذا كانت الكتلة مكونةً من سطر برمجي واحد فقط:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_83" style=""><span class="pun">...</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">each </span><span class="pun">{|</span><span class="pln">shark</span><span class="pun">|</span><span class="pln"> puts shark </span><span class="pun">}</span></pre>

<p>
	وسينتج عنها نفس الخرج السابق.
</p>

<p>
	يعمل التابع <a href="https://wiki.hsoub.com/Ruby/Array/each_index" rel="external"><code>each_with_index</code></a> بنفس طريقة التابع <code>each</code>، ولكنه يتيح الوصول إلى رقم الفهرس للعنصر الحالي في المصفوفة. لنختبر ذلك بطباعة رقم الفهرس والقيمة لكل عنصر من المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_6013_85" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Whale"</span><span class="pun">]</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">each_with_index </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">shark</span><span class="pun">,</span><span class="pln"> index</span><span class="pun">|</span><span class="pln">
  puts </span><span class="str">"The index is #{index}"</span><span class="pln">
  puts </span><span class="str">"The value is #{shark}"</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	تسند روبي قيمة كل عنصر في المصفوفة إلى المتغير <code>shark</code>، وتسند رقم الفهرس الحالي إلى المتغير <code>index</code> في كل مرة، ويمكن بعد ذلك الإشارة إلى هذين المتغيرين داخل الكتلة بحيث يمكن الوصول إلى قيمة العنصر الحالي ورقم فهرسه في المصفوفة.
</p>

<pre class="ipsCode">The index is 0
The value is Hammerhead
The index is 1
The value is Great White
The index is 2
The value is Tiger
The index is 3
The value is Whale
</pre>

<p>
	تعلمنا في هذه الفقرة عدة طرق للمرور على عناصر المصفوفة، وهي من أكثر المهمات التي نحتاجها عند التعامل مع المصفوفات.
</p>

<h2>
	الخاتمة
</h2>

<p>
	المصفوفات في روبي ومعظم لغات البرمجة من المفاهيم المهمة والقوية والتي يجب التعرف عليها وطرق التعامل معها. تعرّفنا في هذا المقال على المصفوفات وكل المهمات الأساسية للتعامل معها من إنشاء المصفوفات والوصول إلى عناصرها وإضافة وإزالة وتعديل العناصر ضمن المصفوفة، وتعرفنا على طريقتين للمرور على عناصر المصفوفة وعرض محتوياتها.
</p>

<p>
	لمزيد من التفصيل، ارجع إلى صفحة <a href="https://wiki.hsoub.com/Ruby/Array" rel="external">النوع Array</a> في موسوعة حسوب.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-work-with-arrays-in-ruby" rel="external nofollow">How To Work with Arrays in Ruby</a> لصاحبيه Brian Hogan و Tony Tran.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/ruby/%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%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-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2140/" rel="">توابع السلاسل النصية في لغة روبي Ruby</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-arrays-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r280/" rel="">المصفوفات (Arrays) في روبي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-data-types-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2138/" rel="">أنواع البيانات Data Types في لغة روبي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2141</guid><pubDate>Mon, 23 Oct 2023 13:06:03 +0000</pubDate></item><item><title>&#x62A;&#x648;&#x627;&#x628;&#x639; &#x627;&#x644;&#x633;&#x644;&#x627;&#x633;&#x644; &#x627;&#x644;&#x646;&#x635;&#x64A;&#x629; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%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-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2140/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_10/----.png.d4cb213c988b94dff288a8463b7bae94.png" /></p>
<p>
	تحتوي السلاسل النصية في <a href="https://academy.hsoub.com/programming/ruby/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-ruby-r636/" rel="">لغة روبي</a> على العديد من التوابع ضمنها والتي تسهل العديد من العمليات الشائعة على السلاسل النصية سنتعرف عليها في هذا المقال، والتي تفيد مثلًا في تحديد طول السلسلة النصية أو تقسيمها واستخراج أجزاء منها، أو إضافة وإزالة المسافات البيضاء whitespace والأحرف الأخرى منها، أو تغيير حالة الأحرف فيها، أو البحث عن نص معين فيها واستبداله بآخر، لينتج عن استخدام تلك التوابع مزايا قوية يمكن الاستفادة منها لحل العديد من المشاكل.
</p>

<h2>
	تحديد طول سلسلة نصية
</h2>

<p>
	تحتوي <a href="https://academy.hsoub.com/programming/ruby/%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-strings-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2139/" rel="">السلاسل النصية</a> على التابع <code>length</code> والذي يُعيد عدد الأحرف في السلسلة النصية، فمثلًا يمكن الاستفادة من ذلك التابع لتحديد الحد الأدنى أو الأقصى لطول كلمة المرور في نظام ما والعديد من الاستخدامات، والمثال التالي يوضح طول سلسلة نصية مُخزنة ضمن متغير ويطبع النتيجة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_8" style=""><span class="pln">open_source </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy contributes to open source."</span><span class="pln">
print open_source</span><span class="pun">.</span><span class="pln">length</span></pre>

<p>
	ليكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">33
</pre>

<p>
	يجب التأكيد على أن كل المحارف ضمن السلسلة النصية بما في ذلك الحروف والأرقام والمسافات والرموز مأخوذة بالحسبان ضمن طول السلسلة النصية، ولمعرفة ما إذا كانت السلسلة النصية فارغة يمكن مقارنة طولها والتأكد بأنه يساوي الصفر 0، أو يمكن استخدام التابع المخصص لذلك وهو <a href="https://wiki.hsoub.com/Ruby/String/empty-3F" rel="external"><code>?empty</code></a> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_10" style=""><span class="pln">name </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pln">
name</span><span class="pun">.</span><span class="pln">empty</span><span class="pun">?</span><span class="pln"> </span><span class="com"># true</span><span class="pln">

name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy"</span><span class="pln">
name</span><span class="pun">.</span><span class="pln">empty</span><span class="pun">?</span><span class="pln"> </span><span class="com"># false</span><span class="pln">

name </span><span class="pun">=</span><span class="pln"> </span><span class="str">" "</span><span class="pln">
name</span><span class="pun">.</span><span class="pln">empty</span><span class="pun">?</span><span class="pln"> </span><span class="com"># false</span></pre>

<p>
	سنتعرف في الفقرة التالية على طريقة الوصول إلى المحارف ضمن السلسلة النصية.
</p>

<h2>
	الوصول إلى المحارف ضمن السلسلة النصية
</h2>

<p>
	توفر لغة روبي التابع <a href="https://wiki.hsoub.com/Ruby/String/slice" rel="external"><code>slice</code></a>، الذي يفيد في استخراج جزء من السلسلة النصية. يُشار لكل محرف ضمن السلسلة النصية برقم الفهرس لها وهو رقم يبدأ ترتيبه من الصفر 0، تمامًا كما هو الحال بالنسبة <a href="https://wiki.hsoub.com/Ruby/Array" rel="external">للمصفوفات arrays</a> في روبي، فمثلًا رقم الفهرس للمحارف في السلسلة النصية <code>Sammy</code> هو:
</p>

<table>
	<thead>
		<tr>
			<th>
				4
			</th>
			<th>
				3
			</th>
			<th>
				2
			</th>
			<th>
				1
			</th>
			<th>
				0
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				y
			</td>
			<td>
				m
			</td>
			<td>
				m
			</td>
			<td>
				a
			</td>
			<td>
				S
			</td>
		</tr>
	</tbody>
</table>

<p>
	يسمح التابع <a href="https://wiki.hsoub.com/Ruby/String/slice" rel="external"><code>slice</code></a> بالوصول إلى محرف واحد أو مجال من المحارف، فعند تمرير رقم صحيح واحد غليه سيُعيد المحرف الموجود في رقم الفهرس المحدد، وعند تمرير رقمين صحيحين مفصولين بفاصلة سيُعيد هذا التابع جميع المحارف بدءًا من رقم الفهرس الأول وحتى رقم الفهرس الثاني، ويمكن تمرير نطاق من الفهارس مثلًا من واحد إلى أربعة <code>4..1</code> لاستخراج الحروف الموجودة ضمن هذا النطاق:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_12" style=""><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">slice</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="com"># "s"</span><span class="pln">
</span><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">slice</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="com"># "am"</span><span class="pln">
</span><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">slice</span><span class="pun">(</span><span class="lit">1.</span><span class="pun">.</span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="com"># "ammy"</span></pre>

<p>
	ويمكن استخدام الصيغة <code>[]</code> والتي هي مرادف للتابع <code>slice</code> ليصبح شكل التعامل مع السلاسل النصية مشابه للمصفوفات:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_14" style=""><span class="str">"Sammy"</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="com"># "s"</span><span class="pln">
</span><span class="str">"Sammy"</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="com"># "am"</span><span class="pln">
</span><span class="str">"Sammy"</span><span class="pun">[</span><span class="lit">1.</span><span class="pun">.</span><span class="lit">4</span><span class="pun">]</span><span class="pln"> </span><span class="com"># "ammy"</span></pre>

<p>
	يمكن الوصول إلى المحارف في نهاية السلسلة النصية باستخدام رقم فهرس سالب، فمثلًا الفهرس <code>1-</code> يعيد المحرف الأخير من السلسلة النصية، والفهرس <code>2-</code> يعيد المحرف ما قبل الأخير وهكذا، ويمكن تحويل سلسلة نصية إلى مصفوفة تحتوي على المحارف المكونة لها باستخدام التابع <code>chars</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_16" style=""><span class="str">"sammy"</span><span class="pun">.</span><span class="pln">chars </span><span class="com"># ["S", "a", "m", "m", "y"]</span></pre>

<p>
	يمكن استخدام هذه الطريقة للتعديل على محارف السلسلة النصية، وسنتعرف في الفقرة التالية على طريقة تغيير حالة الأحرف ضمن السلسلة النصية.
</p>

<h2>
	تعديل حالة الأحرف
</h2>

<p>
	يمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/String/upcase" rel="external"><code>upcase</code></a> لتحويل جميع الحروف الأجنبية في السلسلة النصية إلى أحرف كبيرة، والتابع <a href="https://wiki.hsoub.com/Ruby/String/downcase" rel="external"><code>downcase</code></a> لتحويل جميع الحروف الأجنبية في السلسلة النصية إلى أحرف صغيرة، وتبقى الحروف بغير اللغة الإنجليزية كما هي دون تغيير. سنعدّل في المثال التالي السلسلة النصية "Sammy Shark" إلى حروف كبيرة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_18" style=""><span class="pln">name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy Shark"</span><span class="pln">
print name</span><span class="pun">.</span><span class="pln">upcase
SAMMY SHARK</span></pre>

<p>
	ليكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">SAMMY SHARK
</pre>

<p>
	ولنختبر تحويلها إلى أحرف صغيرة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_20" style=""><span class="pln">print name</span><span class="pun">.</span><span class="pln">downcase</span></pre>

<p>
	سيكون الخرج هنا:
</p>

<pre class="ipsCode">sammy shark
</pre>

<p>
	يسهّل استخدام التابعين <code>upcase</code> و <code>downcase</code> لمقارنة السلاسل النصية مع بعضها عن طريق توحيد حالة الأحرف قبل المقارنة، فمثلًا عند إدخال اسم مستخدم في برنامج ما من قِبل المستخدم بأحرف كبيرة، فيمكن تحويل القيمة المُدخلة إلى حروف صغيرة ثم مقارنتها القيم الموجودة ضمن النظام بأحرف صغيرة. توفر روبي أيضًا التابع <a href="https://wiki.hsoub.com/Ruby/String/capitalize" rel="external"><code>capitalize</code></a>، الذي يعيد نسخةً جديدةً من السلسلة النصية مع تحويل الحرف الأول منها إلى حرف كبير:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_23" style=""><span class="str">"sammy"</span><span class="pun">.</span><span class="pln">capitalize </span><span class="com"># "Sammy"</span></pre>

<p>
	وتوفر روبي أيضًا التابع <a href="https://wiki.hsoub.com/Ruby/String/swapcase" rel="external"><code>swapcase</code></a> والذي يعيد نسخةً جديدةً من السلسلة النصية مع تبديل حالة كل الأحرف فيها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_25" style=""><span class="pln">text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy"</span><span class="pln">
print text</span><span class="pun">.</span><span class="pln">swapcase</span></pre>

<p>
	وسيكون الخرح في هذه الحالة:
</p>

<pre class="ipsCode">sAMMY
</pre>

<p>
	تعيد التوابع <code>downcase</code> و <code>upcase</code> و <code>capitalize</code> و <code>swapcase</code> نسخةً جديدةً من السلسلة النصية وتترك السلسلة الأصلية دون تغيير، ويتوضح ذلك عند التعديل على قيمة سلسلة نصية مُخزنة ضمن متغير ما، فتبقى القيمة ضمن المتغير كما هي دومًا دون تغيير في حال لم نسنِد القيمة الجديدة مجددًا إلى المتغير:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_27" style=""><span class="pln">text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"sammy"</span><span class="pln">
text</span><span class="pun">.</span><span class="pln">capitalize

print </span><span class="str">"Hello, #{text}!"</span></pre>

<p>
	ويكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">Hello, sammy!
</pre>

<p>
	على الرغم من استخدامنا للتابع <code>capitalize</code> على المتغير <code>text</code> في المثال السابق، وبما أننا لم نخزن القيمة المُعادة من <code>capitalize</code> مجددًا داخل المتغير <code>text</code>، فقيمة المتغير <code>text</code> لم تتغير، ولتغييرها يمكن إعادة كتابة الشيفرة السابقة بالشكل التالي لحل هذه المشكلة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_29" style=""><span class="pln">text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"sammy"</span><span class="pln">
text </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="pln">capitalize

print </span><span class="str">"Hello, #{text}!"</span></pre>

<p>
	ويكون الخرح:
</p>

<pre class="ipsCode">Hello, Sammy!
</pre>

<p>
	يمكن استخدام التوابع <a href="https://wiki.hsoub.com/Ruby/String/downcase-21" rel="external"><code>!downcase</code></a> و <a href="https://wiki.hsoub.com/Ruby/String/upcase-21" rel="external"><code>!upcase</code></a> و <a href="https://wiki.hsoub.com/Ruby/String/capitalize-21" rel="external"><code>!capitalize</code></a> و <a href="https://wiki.hsoub.com/Ruby/String/swapcase-21" rel="external"><code>!swapcase</code></a> (لاحظ انتهاء أسمائها بالمحرف <code>!</code>) للتعديل على قيمة السلسلة النصية الأصلية بدلًا من إنشاء سلسلة جديدة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_31" style=""><span class="pln">text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"sammy"</span><span class="pln">
text </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="pln">capitalize</span><span class="pun">!</span><span class="pln">

print </span><span class="str">"Hello, #{text}!"</span></pre>

<p>
	ويجب الانتباه عند التعديل على قيمة السلسلة النصية الأصلية؛ فقد تعدّل قيمة سلسلة نصية في مكان ما ضمن البرنامج دون الانتباه إليه ما يؤدي لمشاكل، وسنتعرف في الفقرة التالية على طريقة إضافة وإزالة المسافات البيضاء من السلاسل النصية.
</p>

<h2>
	إضافة وإزالة المسافات البيضاء الفارغة
</h2>

<p>
	يمكن إضافة المسافات قبل أو بعد أو على كلا طرفي السلسلة النصية لتعديل تنسيقها قبل طباعتها مثلًا، وقد نحتاج أحيانًا لإزالة الأحرف غير الضرورية من بداية أو نهاية السلاسل النصية مثل المسافات الزائدة أو المحارف الخاصة. نبدأ بالتعرف على التابع <a href="https://wiki.hsoub.com/Ruby/String/center" rel="external"><code>center</code></a>، الذي نمرر له طول السلسلة النصية الناتجة التي نريدها وسيضمن أنها بالطول المحدد، وذلك بإضافة مسافات بيضاء حول السلسلة نصية التي يُعالجها على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_33" style=""><span class="str">"Sammy"</span><span class="pun">,</span><span class="pln">center</span><span class="pun">(</span><span class="lit">21</span><span class="pun">)</span><span class="pln"> </span><span class="com"># " Sammy "</span></pre>

<p>
	ويمكننا استبدال المسافات البيضاء بنص معين نريد إضافته بتمريره لذلك التابع مثل وسيط ثانِ على النحو التالي:
</p>

<pre class="ipsCode">" [Sammy] ".center(21, "&lt;&gt;") # "&lt;&gt;&lt;&gt;&lt;&gt; [Sammy] &lt;&gt;&lt;&gt;&lt;&gt;"
</pre>

<p>
	يضيف التابعان <a href="https://wiki.hsoub.com/Ruby/String/ljust" rel="external"><code>ljust</code></a> و <a href="https://wiki.hsoub.com/Ruby/String/rjust" rel="external"><code>rjust</code></a> مسافات بيضاء أو أحرف معينة إلى الجهة اليسرى أو اليمنى من السلسلة النصية ويعملان بالطريقة نفسها التي يعمل بها التابع <code>center</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_35" style=""><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">ljust</span><span class="pun">(</span><span class="lit">20</span><span class="pun">)</span><span class="pln"> </span><span class="com"># "Sammy "</span><span class="pln">
</span><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">rjust</span><span class="pun">(</span><span class="lit">20</span><span class="pun">)</span><span class="pln"> </span><span class="com"># " Sammy"</span><span class="pln">
</span><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">rjust</span><span class="pun">(</span><span class="lit">20</span><span class="pun">,</span><span class="pln"> </span><span class="str">"!"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># "!!!!!!!!!!!!!!!Sammy"</span></pre>

<p>
	يمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/String/rstrip" rel="external"><code>rstrip</code></a> لإزالة المسافات الزائدة في بداية السلسلة النصية، كما يمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/String/lstrip" rel="external"><code>lstrip</code></a> لإزالة المسافات الزائدة في نهاية السلسلة النصية، أما التابع <a href="https://wiki.hsoub.com/Ruby/String/strip" rel="external"><code>strip</code></a> فيزيل المسافات الزائدة في كلا الجهتين (البداية والنهاية) من السلسلة النصية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_37" style=""><span class="str">" Sammy"</span><span class="pun">.</span><span class="pln">rstrip </span><span class="com"># "Sammy"</span><span class="pln">
</span><span class="str">"Sammy "</span><span class="pun">.</span><span class="pln">lstrip </span><span class="com"># "Sammy"</span><span class="pln">
</span><span class="str">" Sammy "</span><span class="pun">.</span><span class="pln">strip </span><span class="com"># "Sammy"</span></pre>

<p>
	يمكن أيضًا استخدام التوابع <code>!center</code> و <code>!ljust</code> و <code>!rjust</code> و <code>!lstrip</code> و <code>!rstrip</code> و <code>!strip</code> لتعديل قيمة السلسلة النصية الأصلية، وفي بعض الأحيان قد نحتاج لإزالة الأحرف من نهاية السلسلة النصية لذلك يمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/String/chop" rel="external"><code>chop</code></a> لإزالة المحرف الأخير من السلسلة النصية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_39" style=""><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">chop </span><span class="com"># "Samm"</span></pre>

<p>
	قد نستفيد من ذلك لإزالة محرف السطر الجديد <code>n\</code> مثلًا من نهاية سلسلة نصية ما:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_41" style=""><span class="str">"This string has a newline\n"</span><span class="pun">.</span><span class="pln">chop</span></pre>

<p>
	يترك التابع <code>chop</code> السلسلة النصية الأصلية دون تعديل ويعيد قيمة سلسلة نصية جديدة بدون المحرف الأخير، بينما يعدل التابع <a href="https://wiki.hsoub.com/Ruby/String/chop-21" rel="external"><code>!chop</code></a> السلسلة النصية الأصلية بدلًا من إنشاء سلسلة جديدة، ويمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/String/chomp" rel="external"><code>chomp</code></a> لإزالة عدة محارف من نهاية السلسلة النصية على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_43" style=""><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">chomp</span><span class="pun">(</span><span class="str">"my"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># "Sam"</span></pre>

<p>
	وفي حال لم نحدد السلسلة النصية التي نريد إزالتها من النهاية فسيزيل التابع <code>chomp</code> محرف السطر الجديد <code>n\</code> فقط:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_45" style=""><span class="str">"This string has a newline\n"</span><span class="pun">.</span><span class="pln">chomp </span><span class="com"># "This string has a newline</span></pre>

<p>
	وفي حال لم تحتوي السلسلة النصية على محرف السطر الجديد <code>n\</code> فسيعيد التابع <code>chomp</code> السلسلة النصية الأصلية كما هي دون تعديل:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_47" style=""><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">chomp </span><span class="com"># "Sammy"</span></pre>

<p>
	استخدام التابع <code>chomp</code> أسهل لإزالة محارف السطر الجديد <code>n\</code> من نهاية السلسلة النصية من التابع <code>chop</code> والذي يزيل دائمًا الحرف الأخير مهما كان نوعه، كما توفر لغة روبي التابع <code>!chomp</code>، الذي يعدل قيمة السلسلة النصية الأصلية ويعيد السلسلة النصية المعدلة إذا أزال محارف من نهاية السلسلة، ولكن وعلى عكس التابع <code>chomp</code> فسيعيد التابع <a href="https://wiki.hsoub.com/Ruby/String/chomp-21" rel="external"><code>!chomp</code></a> القيمة <code>nil</code> إذا لم يُعدل على السلسلة النصية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_49" style=""><span class="pln">string </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello\n"</span><span class="pln">
string</span><span class="pun">.</span><span class="pln">chomp</span><span class="pun">!</span><span class="pln"> </span><span class="com"># "Hello"</span><span class="pln">

string </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello"</span><span class="pln">
string</span><span class="pun">.</span><span class="pln">chomp</span><span class="pun">!</span><span class="pln"> </span><span class="com"># nil</span></pre>

<p>
	سنتعرف في الفقرة التالية على طريقة البحث ضمن السلاسل النصية.
</p>

<h2>
	البحث عن المحارف والنصوص
</h2>

<p>
	نحتاج أحيانًا لتحديد ما إذا كانت السلسلة النصية تحتوي على نص معين أم لا، لهذا الغرض توفر روبي التابع <a href="https://wiki.hsoub.com/Ruby/String/include-3F" rel="external"><code>?include</code></a>، الذي يتحقق مما إذا كانت السلسلة النصية تحتوي على سلسلة نصية أخرى، ويعيد القيمة المنطقية <code>true</code> إذا كانت السلسلة النصية تحتوي على السلسلة النصية الأخرى، أو القيمة <code>false</code> في حال لم تحتويها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_51" style=""><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">include</span><span class="pun">?(</span><span class="str">"a"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># true</span><span class="pln">
</span><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">include</span><span class="pun">?(</span><span class="str">"b"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># false</span></pre>

<p>
	يعيد التابع <a href="https://wiki.hsoub.com/Ruby/String/index" rel="external"><code>index</code></a> رقم الفهرس لمكان محرف أو سلسلة نصية ما، أو يعيد القيمة <code>nil</code> في حال عدم العثور على المحرف أو السلسلة النصية الجزئية ضمنها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_53" style=""><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">index</span><span class="pun">(</span><span class="str">"a"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># 1</span><span class="pln">
</span><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">index</span><span class="pun">(</span><span class="str">"mm"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># 2</span><span class="pln">
</span><span class="str">"Sammy"</span><span class="pun">.</span><span class="pln">index</span><span class="pun">(</span><span class="str">"Fish"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># nil</span></pre>

<p>
	يبحث التابع <code>index</code> عن أول تواجد للمحرف أو السلسلة النصية المطلوبة فقط ويعيد رقم الفهرس له. لنوضح ذلك في المثال التالي على سلسلة نصية طويلة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_55" style=""><span class="pln">text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy has a balloon"</span><span class="pln">
text</span><span class="pun">.</span><span class="pln">index</span><span class="pun">(</span><span class="str">"a"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># 1</span></pre>

<p>
	تحتوي السلسلة النصية "Sammy has a balloon" على أربعة حروف "a"، ولكن التابع <code>index</code> يعيد فقط موقع أول ظهور لذلك الحرف، ويجب أخذ ذلك بالحسبان عند البحث ضمن السلاسل النصية، ولتحديد كل ظهور للحرف "a" ضمن الجملة السابقة يمكن تحويل السلسلة النصية إلى مصفوفة من الأحرف المكونة لها ثم الاستعانة بتوابع المصفوفة للبحث بين تلك الحروف عن كل مكان لذلك الحرف وتحديد رقم الفهرس له مثلًا على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_57" style=""><span class="pln">text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy has a balloon"</span><span class="pln">
indices </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="pln">chars
</span><span class="pun">.</span><span class="pln">each_with_index
</span><span class="pun">.</span><span class="pln">select</span><span class="pun">{|</span><span class="pln">char</span><span class="pun">,</span><span class="pln"> index</span><span class="pun">|</span><span class="pln"> char </span><span class="pun">==</span><span class="pln"> </span><span class="str">"a"</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">map</span><span class="pun">{|</span><span class="pln">pair</span><span class="pun">|</span><span class="pln"> pair</span><span class="pun">.</span><span class="pln">last</span><span class="pun">}</span><span class="pln">

print indices
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">13</span><span class="pun">]</span></pre>

<p>
	ليكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">[1, 7, 10, 13]
</pre>

<p>
	يعيد التابع <code>each_with_index</code> مصفوفة ثنائية الأبعاد يحتوي كل عنصر منها على الحرف ومكانه ضمن السلسلة النصية، ونختار ضمن التابع <code>select</code> العناصر التي تحتوي على الحرف<code>a</code>، ثم نحول تلك العناصر باستخدام التابع <code>map</code> إلى مصفوفة تحتوي على رقم الفهرس لكل تواجد للحرف <code>a</code>، ويمكن التحقق مما إذا كانت السلسلة النصية تبدأ بحرف أو سلسلة نصية معينة باستخدام التابع <a href="https://wiki.hsoub.com/Ruby/String/start_with-3F" rel="external"><code>?start_with</code></a> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_59" style=""><span class="pln">text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy has a balloon"</span><span class="pln">
text</span><span class="pun">.</span><span class="pln">start_with</span><span class="pun">?(</span><span class="str">"s"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># true</span><span class="pln">
text</span><span class="pun">.</span><span class="pln">start_with</span><span class="pun">?(</span><span class="str">"Sammy has"</span><span class="pln"> </span><span class="com"># true</span></pre>

<p>
	يقبل التابع <code>?start_with</code> سلسلةً نصيةً واحدةً أو أكثر مثل وسطاء له، ويعيد <code>true</code> إذا تطابق أي من تلك السلاسل النصية مع بداية السلسلة الأصلية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_61" style=""><span class="pln">text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy has a balloon"</span><span class="pln">
text</span><span class="pun">.</span><span class="pln">start_with</span><span class="pun">?(</span><span class="str">"Sammy the Shark"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Sammy"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># true</span></pre>

<p>
	لم يُعثر في هذا المثال على السلسلة النصية "Sammy the Shark"، ولكن عُثر على السلسلة النصية "Sammy"، لذا أرجع التابع القيمة <code>true</code>، وبالمقابل يمكن استخدام التابع <code>?end_with</code> للتحقق مما إذا كانت السلسلة النصية تنتهي بسلسلة نصية معينة، إذ يعمل هذا التابع بنفس طريقة عمل التابع <code>?start_with</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_63" style=""><span class="pln">text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy has a balloon"</span><span class="pln">
text</span><span class="pun">.</span><span class="pln">end_with</span><span class="pun">?(</span><span class="str">"balloon"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># true</span><span class="pln">
text</span><span class="pun">.</span><span class="pln">end_with</span><span class="pun">?(</span><span class="str">"boomerang"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># false</span><span class="pln">
text</span><span class="pun">.</span><span class="pln">end_with</span><span class="pun">?(</span><span class="str">"boomerang"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"balloon"</span><span class="pun">)</span><span class="pln"> </span><span class="com"># true</span></pre>

<p>
	بعد أن تعرفنا على طرق البحث ضمن النصوص، سنتعرف في الفقرة التالية على طريقة استبدال أجزاء معينة من السلسلة النصية.
</p>

<h2>
	استبدال أجزاء من النص في السلاسل النصية
</h2>

<p>
	يمكن البحث عن سلسلة نصية واستبدالها بأخرى باستخدام خاصية البحث والاستبدال المتوفرة عادةً في محررات النصوص التي نستخدمها، ويمكن تنفيذ هذه الميزة في لغة روبي باستخدام التوابع <a href="https://wiki.hsoub.com/Ruby/String/sub" rel="external"><code>sub</code></a> و <a href="https://wiki.hsoub.com/Ruby/String/gsub" rel="external"><code>gsub</code></a>، إذ يبدل التابع <code>sub</code> جزءًا من النص بجزء آخر. سنغيّر في المثال التالي الجزء <code>"has"</code> إلى <code>"had"</code> في الجملة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_65" style=""><span class="pln">balloon </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy has a balloon"</span><span class="pln">
print balloon</span><span class="pun">.</span><span class="pln">sub</span><span class="pun">(</span><span class="str">"has"</span><span class="pun">,</span><span class="str">"had"</span><span class="pun">)</span></pre>

<p>
	ليعيد التابع قيمة النص بعد التبديل:
</p>

<pre class="ipsCode">Sammy had a balloon.
</pre>

<p>
	يستبدل التابع <code>sub</code> أول ورود للنص المطابق بالنص الجديد فقط. لتوضيح ذلك سنستخدم الجملة التالية المعدّلة التي تحتوي على ورودين للكلمة <code>"has"</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_67" style=""><span class="pln">balloon </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy has a balloon. The balloon has a ribbon"</span><span class="pln">
print balloon</span><span class="pun">.</span><span class="pln">sub</span><span class="pun">(</span><span class="str">"has"</span><span class="pun">,</span><span class="str">"had"</span><span class="pun">)</span></pre>

<p>
	وسيكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">Sammy had a balloon. The balloon has a ribbon
</pre>

<p>
	نلاحظ تبديل أول ظهور فقط، ولتبديل جميع الأماكن التي ترد فيها السلسلة النصية يمكن استخدام التابع <code>gsub</code> الذي يبدل على مستوى النص بأكمله:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_69" style=""><span class="pln">balloon </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy has a balloon. The balloon has a ribbon"</span><span class="pln">
print balloon</span><span class="pun">.</span><span class="pln">gsub</span><span class="pun">(</span><span class="str">"has"</span><span class="pun">,</span><span class="str">"had"</span><span class="pun">)</span><span class="pln">
</span><span class="typ">Sammy</span><span class="pln"> had a balloon</span><span class="pun">.</span><span class="pln"> </span><span class="typ">The</span><span class="pln"> balloon had a ribbon</span></pre>

<p>
	ويكون الخرج:
</p>

<pre class="ipsCode">Sammy had a balloon. The balloon had a ribbon
</pre>

<p>
	تعيد التوابع <code>sub</code> و <code>gsub</code> سلسلةً نصيةً جديدةً دون تعديل السلسلة الأصلية، ويمكن توضيح ذلك بتغيير الكلمة "balloon" إلى "boomerang" في السلسلة النصية التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_71" style=""><span class="pln">text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy has a balloon"</span><span class="pln">
text</span><span class="pun">.</span><span class="pln">gsub</span><span class="pun">(</span><span class="str">"ballooon"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"boomerang"</span><span class="pun">)</span><span class="pln">
print text
</span><span class="typ">Sammy</span><span class="pln"> has a balloon</span></pre>

<p>
	التي تعطي الخرج التالي:
</p>

<pre class="ipsCode">Sammy has a balloon
</pre>

<p>
	نلاحظ بقاء النص كما هو على الرغم من إمكانية الاستبدال، وذلك لأننا لم نخزن نتيجة التابع <code>gsub</code> في المتغير مجددًا، وللحصول على النتيجة التي نريدها يمكننا تعديل الشيفرة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_73" style=""><span class="pln">text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy has a balloon"</span><span class="pln">
text </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="pln">sub</span><span class="pun">(</span><span class="str">"ballooon"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"boomerang"</span><span class="pun">)</span><span class="pln">
print text</span></pre>

<p>
	أو يمكن استخدام التابع <code>!sub</code> بدلًا من التابع <code>sub</code>والذي يعدل على السلسلة الأصلية بدلًا من إعادة سلسلة جديدة. سنستخدم في المثال التالي التابع <code>!sub</code> لتغيير الجملة "red balloon" إلى "blue boomerang":
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_75" style=""><span class="pln">text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy has a red balloon"</span><span class="pln">
text</span><span class="pun">.</span><span class="pln">sub</span><span class="pun">!(</span><span class="str">"red"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"blue"</span><span class="pun">)</span><span class="pln">
text</span><span class="pun">.</span><span class="pln">sub</span><span class="pun">!(</span><span class="str">"balloon"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"boomerang"</span><span class="pun">)</span><span class="pln">
print text</span></pre>

<p>
	ليكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">Sammy has a balloon
</pre>

<p>
	يمكن استخدام التابع <a href="https://wiki.hsoub.com/Ruby/String/gsub-21" rel="external"><code>!gsub</code></a> لاستبدال كل ورود للنص المحدد والتعديل على قيمة السلسلة النصية الأصلية، ويمكن تمرير <a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D8%A8%D9%8A%D8%B1-%D8%A7%D9%84%D9%86%D9%85%D8%B7%D9%8A%D8%A9-regular-expressions-r63/" rel="">التعابير النمطية Regular Expressions</a> -أو اختصارًا regex- للتوابع <code>sub</code> و <code>gsub</code> للبحث عن نمط معين، ففي المثال التالي سنبدل جميع الحروف الصوتية ضمن النص بالرمز <code>@</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_77" style=""><span class="str">"Sammy has a red balloon"</span><span class="pun">.</span><span class="pln">gsub</span><span class="pun">(</span><span class="str">/[aeiou]/</span><span class="pun">,</span><span class="pln"> </span><span class="str">"@"</span><span class="pun">)</span></pre>

<p>
	وسيكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">"S@mmy h@s @ r@d b@ll@@n"
</pre>

<p>
	ويمكن تمرير <a href="https://academy.hsoub.com/programming/ruby/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-data-types-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2138/" rel="">جدول Hash</a> بدلًا من سلسلة نصية ثابتة لتحديد كيفية استبدال كل جزء من النص الوارد بصورةٍ مختلفة، ففي المثال التالي سنبدّل جميع حروف "a" إلى المحرف "@" وجميع الحروف "o" إلى الرقم صفر:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4060_79" style=""><span class="str">"Sammy has a red balloon"</span><span class="pun">.</span><span class="pln">gsub</span><span class="pun">(</span><span class="str">/[aeiou]/</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="str">"a"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"@"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"o"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"0"</span><span class="pun">})</span><span class="pln">
</span><span class="com"># "S@mmy h@s @ rd b@ll00n"</span></pre>

<p>
	نلاحظ أن ذلك يمنحنا إمكانية إجراء عمليات تبديل معقدة على النصوص والذي يفيدنا في حل بعض المشاكل المعقدة.
</p>

<h2>
	الخاتمة
</h2>

<p>
	تعرفنا في هذا المقال على العديد من التوابع التي تسمح لنا بالتعامل مع السلاسل النصية باستخدام توابع مبينة مسبقًا لنوع البيانات الخاص بالسلاسل النصية، ومنها ما كان يترك السلسلة الأصلية دون تعديل ومنها من يعدّل عليها.
</p>

<p>
	يعتمد اختيار التوابع التي سنستخدمها على احتياجاتنا، إذ تمنح لغة روبي المبرمجين المرونة لاختيار التوابع التي تفيدهم في العمل مع البيانات الخاصة بهم، وينصح باستخدام التوابع التي لا تعدل على القيمة الأصلية لأنها أسهل في تطوير البرامج وتجنب الأخطاء.
</p>

<p>
	لمزيد من التفصيل، ارجع إلى صفحة <a href="https://wiki.hsoub.com/Ruby/String" rel="external">النوع String</a> في موسوعة حسوب.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-work-with-string-methods-in-ruby" rel="external nofollow">How To Work with String Methods in Ruby</a> لصاحبه Brian Hogan.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/ruby/%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-strings-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2139/" rel="">السلاسل النصية في لغة روبي Ruby</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D9%88%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r254/" rel="">السلاسل والمتغيرات في روبي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-ruby-r529/" rel="">الدليل السريع إلى لغة البرمجة روبي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2140</guid><pubDate>Mon, 16 Oct 2023 13:03:04 +0000</pubDate></item><item><title>&#x627;&#x644;&#x633;&#x644;&#x627;&#x633;&#x644; &#x627;&#x644;&#x646;&#x635;&#x64A;&#x629; Strings &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%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-strings-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2139/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_10/---.png.623a45d1482b7f62a14bc53bd07241b5.png" /></p>
<p>
	السلسلة النصية string هي سلسلة من محرف واحد أو أكثر، والمحرف هو إمّا حرف أو رقم أو رمز، وقد ذكرنا في <a href="https://academy.hsoub.com/programming/ruby/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-data-types-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2138/" rel="">المقال السابق</a> أن السلاسل النصية في <a href="https://academy.hsoub.com/programming/ruby/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-ruby-r636/" rel="">لغة روبي</a> تتمثل بكائن، وعلى عكس لغات البرمجة الأخرى تكون السلاسل النصية في روبي قابلةً للتعديل على قيمتها مباشرةً ضمن نفس المتغير، وهي من أكثر أنواع البيانات استخدامًا، إذ تسمح بعرض النصوص التي تفيد مثل طريقة تواصل نصية مع المستخدم، فمثلًا يتألف هذا المقال من سلاسل نصية يُظهرها متصفح الويب على الشاشة.
</p>

<p>
	سنتعرف في هذا المقال على طرق التعامل مع السلاسل النصية في لغة روبي بدءًا من طريقة إنشائها وعرضها على الشاشة وتخزينها في متغيرات ودمجها معًا، وسنتعرف أيضًا على طريقة التعامل مع المحارف الخاصة مثل الأسطر الجديدة والفواصل وعلامات الاقتباس المزدوجة double quotes.
</p>

<h2>
	إنشاء وطباعة السلاسل النصية
</h2>

<p>
	يمكن تعريف السلاسل النصية في لغة روبي بكتابة مجموعة من المحارف بين علامتي اقتباس مفردة <code>'</code> أو علامتي اقتباس مزدوجة <code>"</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_8" style=""><span class="str">'This is a string in single quotes.'</span><span class="pln">

</span><span class="str">"This is a string in double quotes."</span></pre>

<p>
	يمكن استخدام إما علامتي اقتباس مفردة أو مزدوجة، وفي معظم الحالات لا يوجد فرق بينهما، بشرط استخدام نفس العلامة في بداية ونهاية السلسلة النصية؛ وميزة استخدام علامة الاقتباس المزدوجة أنها تسمح بتركيب السلاسل النصية وسنتعرف على تلك الميزة لاحقًا في هذا المقال.
</p>

<p>
	يمكن طباعة السلسلة النصية على الشاشة باستخدام التابع <code>print</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_10" style=""><span class="pln">print </span><span class="str">"Let's print out this string."</span></pre>

<p>
	يعرض التابع<code>print</code> السلسلة النصية كما هي دون إجراء أي تعديل عليها. لنختبر ذلك عن طريق <a href="https://academy.hsoub.com/programming/ruby/%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%A8%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2115/" rel="">إنشاء ملف روبي جديد</a> بالاسم "print.rb"، ونكتب داخله باستخدام محرر النصوص عدة أوامر طباعة للسلاسل النصية على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_13" style=""><span class="pln">print </span><span class="str">'This is the first string.'</span><span class="pln">
print </span><span class="str">'This is the second string.'</span><span class="pln">
print </span><span class="str">'This is the third string.'</span></pre>

<p>
	نحفظ الملف وننفذ البرنامج:
</p>

<pre class="ipsCode">$ ruby print.rb
</pre>

<p>
	ليظهر الخرج التالي:
</p>

<pre class="ipsCode">This is the first string.This is the second string.This is the third string.
</pre>

<p>
	نلاحظ طباعة كل السلاسل النصية على نفس السطر، ويمكن طباعة كل منها بسطر جديد عن طريق إضافة محرف السطر الجديد يدويًا لنهاية كل منها، أو استخدام التابع <code>puts</code>، الذي يضيف حرف السطر الجديد تلقائيًا في نهاية كل سلسلة نصية. لاختبار ذلك، نعدّل على البرنامج السابق ونبدّل التابع <code>print</code> بالتابع <code>puts</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_15" style=""><span class="pln">puts </span><span class="str">'This is the first string.'</span><span class="pln">
puts </span><span class="str">'This is the second string.'</span><span class="pln">
puts </span><span class="str">'This is the third string.'</span></pre>

<p>
	عند تنفيذ البرنامج نلاحظ الخرج التالي:
</p>

<pre class="ipsCode">This is the first string.
This is the second string.
This is the third string.
</pre>

<p>
	يطبع التابع<code>puts</code> السلسلة النصية المُمررة له بعد إضافة محرف السطر الجديد تلقائيًا في نهايتها.
</p>

<h2>
	تخزين السلاسل النصية ضمن متغيرات
</h2>

<p>
	تشير المتغيرات إلى مكان ما في ذاكرة الحاسوب نسند إليه اسمًا، وتفيد في تخزين البيانات لاسترجاعها لاحقًا، ولتخزين سلسلة نصية ضمن متغيرٍ ما، نعرف اسم المتغير ونسند قيمة السلسلة النصية إليه على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_17" style=""><span class="pln">my_string </span><span class="pun">=</span><span class="pln"> </span><span class="str">'This is my string'</span></pre>

<p>
	بعد تعريف المتغير يمكن الإشارة إليه عن طريق اسمه لتمريره مثلًا إلى تابع ما كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_20" style=""><span class="pln">print my_string</span></pre>

<p>
	لاختبار ذلك ننشئ الملف "string_variables.rb":
</p>

<pre class="ipsCode">$ nano string_variables.rb
</pre>

<p>
	ونضيف التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_22" style=""><span class="pln">my_name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy the Shark"</span><span class="pln">
my_age </span><span class="pun">=</span><span class="pln"> </span><span class="str">"none of your business"</span><span class="pln">

puts my_name
puts my_age</span></pre>

<p>
	يُعرّف هذا البرنامج المتغيرين <code>my_name</code> و <code>my_age</code> ويسند لكل منهما قيمة سلسلة نصية، ثم يستخدم التابع <code>puts</code> لطباعة كل سلسلة نصية منهما على سطر منفصل. نحفظ الملف من خلال الضغط على المفتاحين "CTRL + X" ثم على المفتاح "y" ثم ننفذ البرنامج على النحو التالي:
</p>

<pre class="ipsCode">$ ruby string_variables.rb
</pre>

<p>
	ليظهر الخرج التالي:
</p>

<pre class="ipsCode">Sammy the Shark
none of your business
</pre>

<p>
	من خلال تعريف المتغيرات وإسناد قيم السلاسل النصية إليها يصبح من السهل التعامل معها وكذلك نتجنب تكرار كتابة نفس السلسلة النصية مرارًا وتكرارًا عند كل استخدام. سنتعرف في الفقرة التالية على طريقة دمج السلاسل النصية معًا لإنشاء سلاسل نصية جديدة.
</p>

<h2>
	دمج السلاسل النصية
</h2>

<p>
	يعني دمج السلاسل النصية concatenation دمج سلسلتين نصيتين أو أكثر لإنشاء سلسلة نصية جديدة، ويمكن لتنفيذ ذلك استخدام معامل الدمج الممثل بالرمز <code>+</code> والذي يستخدم أيضًا في عمليات الجمع في العمليات الحسابية، كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_24" style=""><span class="str">"sammy"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"shark"</span></pre>

<p>
	لينتج سلسلة نصية جديدة مكونة من دمج تلك السلسلتين:
</p>

<pre class="ipsCode">sammyshark
</pre>

<p>
	لإضافة مسافة بين السلسلتين النصيتين، ينبغي عليك إضافة تلك المسافة ضمن إحدى السلسلتين على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_26" style=""><span class="str">"sammy "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"shark"</span></pre>

<p>
	ويمكن دمج السلاسل النصية مع تلك المُخزنة ضمن المتغيرات بنفس الطريقة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_28" style=""><span class="pln">color </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Blue"</span><span class="pln">
print </span><span class="str">"My favorite color is "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> color</span></pre>

<p>
	لينتج عن تلك العملية السلسلة النصية <code>"My favorite color is blue"</code>، ونلاحظ إضافة مسافة بنهاية السلسلة النصية الأولى لإضافة مسافة بين النص وقيمة المتغير في النتيجة، ويمكن دمج عدة سلاسل النصية معًا بنفس الطريقة. لنختبر ذلك بإنشاء الملف "concatenation.rb" ونضيف داخله التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_30" style=""><span class="pln">my_name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy the Shark"</span><span class="pln">
my_age </span><span class="pun">=</span><span class="pln"> </span><span class="str">"none of your business"</span><span class="pln">

puts </span><span class="str">"My name is "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> my_name </span><span class="pun">+</span><span class="pln"> </span><span class="str">" and my age is "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> my_age </span><span class="pun">+</span><span class="pln"> </span><span class="str">"."</span></pre>

<p>
	يُعرّف هذا البرنامج المتغيرين <code>my_name</code> و <code>my_age</code>، ويُسند لكل منهما قيمة سلسلة نصية كما فعلنا سابقًا، ولكن سنطبع هذه المرة سلسلةً نصيةً مكونةً من دمج عدة قيم مع بعضها، وعند تنفيذ البرنامج يظهر التالي:
</p>

<pre class="ipsCode">My name is Sammy the Shark and my age is none of your business.
</pre>

<p>
	تفيد هذه الطريقة في إدراج قيم المتغيرات داخل السلسلة النصية الجديدة، وينتج عن دمج سلسلتين نصيتين أو أكثر سلسلةً نصيةً جديدةً يمكن استخدامها مثل أي سلسلة نصية أخرى، كأن نسند قيمتها مثلًا لمتغير جديد لاستخدامه لاحقًا:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_32" style=""><span class="pln">my_name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy the Shark"</span><span class="pln">
my_age </span><span class="pun">=</span><span class="pln"> </span><span class="str">"none of your business"</span><span class="pln">

</span><span class="com"># assign concatenated string to variable</span><span class="pln">
output </span><span class="pun">=</span><span class="pln"> </span><span class="str">"My name is "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> my_name </span><span class="pun">+</span><span class="pln"> </span><span class="str">" and my age is "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> my_age </span><span class="pun">+</span><span class="pln"> </span><span class="str">"."</span><span class="pln">

</span><span class="com"># Print the output.</span><span class="pln">
puts output</span></pre>

<p>
	استخدام متغير <code>output</code> إضافي في المثال السابق أمرٌ غير ضروري، إذ تفيد هذه الطريقة في البرامج الأكبر حجمًا، إذ قد تكون هناك حاجة لاستخدامه في أماكن متعددة من البرنامج، كما يُفضّل الفصل بين تنفيذ العمليات على البيانات مثل الدمج والعمليات الحسابية، وبين عملية الطباعة، لأن البرامج مع مرور الوقت ستكبر ولا بُد من تقليل التعقيد فيها، كما يجب التأكد من عدم استخدام معامل الدمج <code>+</code> بين نوعي بيانات مختلفين، فمثلًا لا يمكن دمج سلسلة نصية مع عدد صحيح. دعنا نرى ماذا سيحدث، وننشئ الملف الجديد "strings_and_integers.rb" الذي يحتوي على التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_34" style=""><span class="pln">my_name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy the Shark"</span><span class="pln">
my_number </span><span class="pun">=</span><span class="pln"> </span><span class="lit">27</span><span class="pln">

print my_name </span><span class="pun">+</span><span class="pln"> my_number</span></pre>

<p>
	عرفنا في هذا المثال، المتغير <code>my_name</code>، الذي يحتوي على السلسلة النصية <code>"Sammy the Shark"</code>، والمتغير <code>my_number</code> الذي يحتوي على العدد الصحيح 27، ومن الواضح أن العدد 27 ليس سلسلةً نصيةً لأنه ليس واقعًا بين علامتي اقتباس، وليس عددًا عشريًا أيضًا لأنه لا يحتوي على فاصلة عشرية، فهو من نوع عدد صحيح، وعند تنفيذ البرنامج على النحو التالي:
</p>

<pre class="ipsCode">$ ruby strings_and_ints.rb
</pre>

<p>
	تظهر رسالة الخطأ التالية:
</p>

<pre class="ipsCode">strings_and_ints.rb:4:in `+': no implicit conversion of Integer into String (TypeError)
from strings_and_ints.rb:4:in `&lt;main&gt;'
</pre>

<p>
	تعني رسالة الخطأ "no implicit conversion of Integer into String" أنه يمكن دمج سلسلة نصية مع سلسلة نصية فقط، ولا يمكن دمج عدد صحيح مع سلسلة نصية مباشرةً. سيظهر عند تنفيذ البرنامج في إصدار روبي رقم Ruby 2.3 وما قبل رسالة الخطأ التالية بدلًا من ذلك:
</p>

<pre class="ipsCode">strings_and_ints.rb:4:in `+': no implicit conversion of Fixnum into String (TypeError)
from strings_and_ints.rb:4:in `&lt;main&gt;'
</pre>

<p>
	<strong>ملاحظة:</strong> في الإصدارات السابقة من روبي كنا نعبّر عن الأعداد الصحيحة باستخدام الكلمة المفتاحية <code>Fixnum</code> (اختصارًا للعبارة Fixed Number) وفي إصدار Ruby 2.4 استُبدل كل من <code>Fixnum</code> ونظيرتها <code>Bignum</code> بالكلمة <code>Integer</code>.
</p>

<p>
	يمكننا حل المشكلة بتعديل البرنامج السابق وإضافة علامتي اقتباس حول الرقم 27 ليصبح <code>"27"</code> لتعريفه على أنها سلسلة نصية بدلًا من عدد صحيح، أو يمكننا تحويل العدد إلى سلسلة نصية باستدعاء التابع <code>to_s</code> منه عند إنشاء السلسلة النصية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_36" style=""><span class="pln">my_name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy the Shark"</span><span class="pln">
my_number </span><span class="pun">=</span><span class="pln"> </span><span class="lit">27</span><span class="pln">

print my_name </span><span class="pun">+</span><span class="pln"> my_number</span><span class="pun">.</span><span class="pln">to_s</span></pre>

<p>
	يحول التابع <a href="https://wiki.hsoub.com/Ruby/String/to_s" rel="external"><code>to_s.</code></a> العدد الصحيح إلى سلسلة نصية، وتُعد تلك الطريقة أفضل، إذ يمكن الاحتفاظ بالعدد على أنه عدد صحيح داخل البرنامج كما هو، وتحويله إلى سلسلة نصية عند الحاجة فقط، أي أثناء طباعته مثلًا، وبذلك يمكن استخدامه على أنه عدد صحيح في أماكن أخرى من البرنامج، وعند تنفيذ البرنامج مرةً أخرى سنلاحظ طباعة السطر "Sammy the Shark27".
</p>

<p>
	تُعد عملية تحويل الأرقام إلى سلاسل نصية لدمجها معًا من العمليات التي نحتاجها بصورةٍ متكررة عند التعامل مع مختلف أنواع البيانات، مثل أرقام الهواتف والقيم النقدية وعناوين البريد وغيرها من البيانات التي نحتاج لعرضها على الشاشة ضمن سلسلة نصية.
</p>

<p>
	عملية الدمج مهمة جدًا، ولكن استخدامها قد يكون صعبًا أحيانًا، فإذا نسينا إضافة معامل الجمع <code>+</code> عن طريق الخطأ بين كل زوج من السلاسل النصية التي نحاول دمجها فسينتج خطأ في الصياغة عند تنفيذ البرنامج، ويجب تذكر تحويل الأعداد إلى سلاسل نصية قبل دمجها، لهذا السبب توفر روبي طريقةً أخرى لإدراج قيم المتغيرات داخل السلاسل النصية تدعى تضمين السلاسل string interpolation والتي تحل كلتا المشكلتين وسنتعرف عليها في الفقرة التالية.
</p>

<h2>
	التضمين في السلاسل النصية
</h2>

<p>
	ينتج عن دمج السلاسل النصية والمتغيرات معًا باستخدام معامل الدمج <code>+</code> عبارة برمجية صعبة القراءة والفهم، ومن هنا تأتي ميزة التضمين في السلاسل النصية، إذ تسمح بإدراج العبارات البرمجية داخل سلسلة نصية واحدة محاطة بعلامتي اقتباس مزدوجة حصرًا، فبدلًا من دمج القيم على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_38" style=""><span class="str">"My name is "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> my_name </span><span class="pun">+</span><span class="pln"> </span><span class="str">"!"</span></pre>

<p>
	يمكننا استخدام ميزة التضمين كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_40" style=""><span class="str">"My name is #{my_name}!"</span></pre>

<p>
	نلاحظ أنه وبدلًا من إنهاء السلسلة النصية واستخدام معامل الجمع <code>+</code> لدمجها بقيمة أخرى، نُضمّن قيمة المتغير مباشرةً داخل السلسلة النصية باستخدام الصيغة <code>{}#</code>، وفيها نخبر روبي بتقييم التعبير البرمجي داخلها ودمجه في ذلك المكان من السلسلة النصية. لنختبر ذلك بإنشاء ملف برنامج جديد بالاسم "interpolation.rb" ونضيف ما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_42" style=""><span class="pln">my_name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy the Shark"</span><span class="pln">
my_age </span><span class="pun">=</span><span class="pln"> </span><span class="str">"none of your business"</span><span class="pln">

output </span><span class="pun">=</span><span class="pln"> </span><span class="str">"My name is #{my_name} and my age is #{my_age}."</span><span class="pln">

puts output</span></pre>

<p>
	وهو نفس البرنامج الذي كتبناه سابقًا ولكن باستخدام التضمين لإنشاء النتيجة النهائية. يتيح التضمين ميزةً أخرى وهي تحويل القيم الرقمية إلى سلاسل نصية تلقائيًا قبل دمجها، ولاختبار ذلك نعود إلى الملف "strings_and_integers.rb" الذي كتبناه سابقًا ونغير السطر الأخير ليصبح على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_44" style=""><span class="pln">my_name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy the Shark"</span><span class="pln">
my_number </span><span class="pun">=</span><span class="pln"> </span><span class="lit">27</span><span class="pln">

</span><span class="com"># use interpolation instead of concatenation</span><span class="pln">
print </span><span class="str">"My name is #{my_name} and my favorite number is #{my_number}."</span></pre>

<p>
	ستحوّل روبي المتغير <code>my_number</code> إلى سلسلة نصية تلقائيًا، ونلاحظ ذلك عند تشغيل البرنامج والذي سيطبع النتيجة التالية دون حدوث أخطاء:
</p>

<pre class="ipsCode">My name is Sammy the Shark and my favorite number is 27.
</pre>

<p>
	نلاحظ قوة ميزة التضمين في السلاسل النصية فهي الطريقة المفضلة دومًا لدمج السلاسل النصية مع قيم المتغيرات الأخرى بسهولة في التعامل والقراءة.
</p>

<h2>
	صياغة السلسلة النصية وقيمتها
</h2>

<p>
	نلاحظ أن جميع السلاسل النصية التي أنشأناها محاطةٌ بعلامات الاقتباس ضمن الشيفرة البرمجية، ولكن الناتج النهائي عند الطباعة لا يتضمن علامات الاقتباس، ويوجد فرق بين الاشارة إلى السلاسل النصية في الشفرة البرمجية وما يُطبع، فالسلسلة النصية المكتوبة في الشيفرة البرمجية بما في ذلك علامات الاقتباس هي صياغة السلسلة النصية، بينما النتيجة التي تُعرض للمستخدم دون علامات الاقتباس بعد معالجة تلك القيمة هي قيمة تلك السلسلة. يمثل ما يلي صياغة لسلسلة نصية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_46" style=""><span class="str">"Sammy the Shark"</span></pre>

<p>
	وقيمة السلسلة النصية تلك هي العبارة <code>Sammy the Shark</code>، ويبرز الفرق بين صياغة السلسلة النصية وقيمتها عند استخدام المحارف الخاصة مثل علامات الاقتباس أو الفواصل ضمن السلسلة النصية، وسنتعرف على طريقة إدراجها في الفقرة التالية.
</p>

<h2>
	إدراج علامات الاقتباس ضمن السلاسل النصية
</h2>

<p>
	تُستخدم علامات الاقتباس المفردة والمزدوجة ضمن لغة روبي لتحديد بداية ونهاية السلسلة النصية، لذلك لا يمكن استخدامها ضمن قيمة السلسلة النصية نفسها، فإذا حاولنا مثلًا استخدام علامة اقتباس مفردة ضمن سلسلة نصية محاطة بعلامات اقتباس مفردة سيحدث خطأ:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_48" style=""><span class="str">'This isn'</span><span class="pln">t what I wanted</span><span class="pun">.</span><span class="str">'</span></pre>

<p>
	إذ ستفهم لغة روبي علامة الاقتباس المفردة ضمن الكلمة <code>isn't</code> بأنها نهاية السلسلة النصية، وقبلها وما بعدها هو شيفرة روبي وليس تكملة للنص مما سينتج عنه خطأ، وتنطبق نفس الحالة على استخدام علامات الاقتباسات المزدوجة في سلسلة نصية محاطة بعلامات اقتباس مزدوجة كما هو الحال في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_50" style=""><span class="str">"Sammy says, "</span><span class="typ">Hello</span><span class="pun">!</span><span class="str">""</span></pre>

<p>
	ففي هذا المثال تنتهي السلسلة النصية عند علامة الاقتباس المزدوجة الأولى قبل الكلمة <code>Hello</code>، وتبدأ شيفرة روبي اعتيادية بعدها مما يؤدي إلى حدوث خطأ. لتجنب هذه المشكلة لدينا عدة خيارات؛ إذ يمكن استخدام علامات الاقتباس المقابلة لعلامة الاقتباس التي نريد إدراجها ضمن النص، فمثلًا عند الحاجة إلى استخدام علامات الاقتباس المزدوجة ضمن السلسلة النصية، نُعرف السلسلة النصية باستخدام علامات اقتباس مفردة والعكس صحيح؛ أو يمكن استخدام محارف الهروب؛ أو استخدام صيغ مختلفة لإنشاء السلاسل النصية في روبي سنتعرف على كل من تلك الطرق على حدى في الفقرات التالية.
</p>

<h3>
	الخيار الأول: استخدام علامات الاقتباس المقابلة
</h3>

<p>
	أسهل طريقة لإدراج علامات الاقتباس ضمن السلاسل النصية هي استخدام علامات الاقتباس المقابلة للعلامة المُدرجة، فعندما تحتوي السلسلة النصية على علامات اقتباس مزدوجة، نستخدم العلامات المفردة لتعريف السلسلة النصية، وعندما تحتوي السلسلة النصية على علامات اقتباس مفردة نستخدم علامات الاقتباس المزدوجة لتعريف السلسلة النصية، فبدلًا من تعريف السلسلة النصية التالية بعلامات الاقتباس المفردة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_52" style=""><span class="str">'This isn'</span><span class="pln">t what I wanted</span><span class="pun">.</span><span class="str">'</span></pre>

<p>
	سنعرفها باستخدام علامات اقتباس مزدوجة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_54" style=""><span class="str">"This isn't what I wanted."</span></pre>

<p>
	وبدلًا من تعريف القيمة التالية باستخدام علامات اقتباس مزدوجة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_56" style=""><span class="str">"Sammy says, "</span><span class="typ">Hello</span><span class="pun">!</span><span class="str">""</span></pre>

<p>
	سنستخدم علامات الاقتباس المفردة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_58" style=""><span class="str">'Sammy says, "Hello!"'</span></pre>

<p>
	لا يمكن الاعتماد على هذا الحل دومًا، سوى عند استخدام نوع واحد من علامات الاقتباس ضمن السلسلة النصية، أما عند استخدام كلا النوعين كما هو واضح في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_60" style=""><span class="str">"Sammy says, "</span><span class="pln">I</span><span class="str">'m a happy shark!""</span></pre>

<p>
	في هذا المثال، تنتهي السلسلة النصية عند علامة الاقتباس المزدوجة الأخيرة قبل <code>I'm</code>، ومن ثم تبدأ روبي في قراءة الكلمة <code>I'm</code> والتي تبدأ فيها بسلسلة نصية جديدة بقيمة <code>""!m a happy shark</code>، ولكن هذه السلسلة النصية الجديدة لا تحتوي على علامة اقتباس مفردة تُنهيها، وعند محاولة استخدام علامات الاقتباس المفردة لتعريف السلسلة النصية تُضمّن علامة اقتباس مفردة داخل النص مما يؤدي إلى نفس المشكلة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_62" style=""><span class="str">'Sammy says, "I'</span><span class="pln">m a happy shark</span><span class="pun">!</span><span class="str">"'</span></pre>

<p>
	تنتهي السلسلة النصية هذه المرة عند علامة الاقتباس المفردة بعد كلمة <code>I'm</code>، واللجوء لهذا الخيار دومًا يجعل السلاسل النصية ضمن البرنامج الواحد غير متناسقة، فتارةً يجب استخدام العلامات المفردة وتارةً أخرى المزدوجة. لحل تلك المشكلة يمكننا استخدام طريقة محارف الهروب Escaping characters التي سنتعرف عليها في الفقرة التالية.
</p>

<h3>
	الخيار الثاني: استخدام محارف الهروب في السلاسل النصية
</h3>

<p>
	يمكن استخدام <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D8%AB%D9%88%D8%A7%D8%A8%D8%AA-%D9%88%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%87%D8%B1%D9%88%D8%A8-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-c-r1614/" rel="">محارف الهروب</a> ضمن السلاسل النصية وذلك بوضع خط مائل عكسي <code>\</code> قبلها، لإخبار روبي بأن المحرف التالي لها على هو جزء من السلسلة النصية نفسها. لتوضيح فائدة تلك الطريقة سنحاول معالجة النص التالي الذي يحتوي على علامات اقتباس مزدوجة ومفردة داخله:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_64" style=""><span class="str">"Sammy says, "</span><span class="pln">I</span><span class="str">'m a happy shark!""</span></pre>

<p>
	ننشئ ملف جديد بالاسم "quoting.rb" بداخله التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_66" style=""><span class="pln">print </span><span class="str">"Sammy says, "</span><span class="pln">I</span><span class="str">'m a happy shark!""</span></pre>

<p>
	ننفذ البرنامج:
</p>

<pre class="ipsCode">$ ruby quoting.rb
</pre>

<p>
	ونلاحظ ظهور خطأ بسبب وجود علامات الاقتباس المزدوجة داخل السلسلة النصية:
</p>

<pre class="ipsCode">quoting.rb:1: syntax error, unexpected tCONSTANT, expecting end-of-input
print "Sammy says, "I'm a happy shark!""
^
</pre>

<p>
	لحل تلك المشكلة نضع الخط المائل العكسي <code>\</code> قبل كل علامة اقتباس مزدوجة داخل النص كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_69" style=""><span class="pln">print </span><span class="str">"Sammy says, \"I'm a happy shark!\""</span></pre>

<p>
	وننفذ البرنامج مرة أخرى ونلاحظ طباعة النص دون أي مشاكل:
</p>

<pre class="ipsCode">Sammy says, "I'm a happy shark!"
</pre>

<p>
	نلاحظ بأننا لم نكن بحاجة للهروب من علامات الاقتباس المفردة في هذا المثال، وذلك لاستخدامنا علامات مزدوجة لتعريف السلسلة النصية، لذا يجب فقط الهروب من علامات الاقتباسات التي تفهمها روبي خطأً. يمكننا الاستغناء عن محارف الهروب من علامات الاقتباسات تمامًا وذلك باستخدام صيغة مختلفة لتعريف السلاسل النصية سنتعرف عليها في الخيار الثالث في الفقرة التالية.
</p>

<h3>
	الخيار الثالث: الصيغة البديلة لتعريف السلاسل النصية
</h3>

<p>
	استخدمنا حتى الآن علامات الاقتباس لتعريف السلاسل النصية، وتوفر روبي طريقةً أخرى لإنشاء سلاسل نصية باستخدام محارف أخرى، إذ يمكننا تعريف محرف فاصل delimiter أو محرف غير موجود ضمن السلسلة النصية وأن نحيط به قيمة السلسلة النصية بدلًا من علامات الاقتباس، وندل روبي على المحرف الذي اخترناه بذكره بعد محرف النسبة المئوية <code>%</code>، ففي المثال التالي اخترنا المحرف <code>$</code> لتعريف السلسلة النصية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_71" style=""><span class="pun">%</span><span class="pln">$Sammy says</span><span class="pun">,</span><span class="pln"> </span><span class="str">"I'm a happy shark!"</span><span class="pln">$</span></pre>

<p>
	تهرب هذه الصيغة تلقائيًا من المحارف الخاصة ضمن السلسلة النصية وينتج عن السلسلة النصية السابقة ما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_73" style=""><span class="str">"Sammy says, \"I'm a happy shark!\""</span></pre>

<p>
	ويجب الانتباه إلى تغيير المحرف الفاصل في حال وجوده ضمن السلسلة النصية، فمثلًا في المثال السابق إذا احتوى النص على المحرف <code>$</code> فيجب الهروب بإضافة المحرف <code>\</code> قبله ضمن النص، أو يمكن استخدام زوج من الأقواس المعقوصة Curly braces <code>{</code> و <code>}</code> لتحديد بداية ونهاية السلسلة النصية، أو الأقواس المعقوفة square braces <code>[</code> و <code>]</code>، أو الأقواس الهلالية parentheses <code>(</code> و <code>)</code>، ولكن الأقواس المعقوصة هي الأكثر شيوعًا:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_75" style=""><span class="pun">%{</span><span class="typ">Sammy</span><span class="pln"> says</span><span class="pun">,</span><span class="pln"> </span><span class="str">"I'm a happy shark!"</span><span class="pun">}</span></pre>

<p>
	تدعم كل تلك الصيغ ميزة تضمين القيم داخل السلسلة النصية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_77" style=""><span class="pln">droplets </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
print </span><span class="pun">%{</span><span class="typ">Sammy</span><span class="pln"> says</span><span class="pun">,</span><span class="pln"> </span><span class="str">"I just created #{droplets} droplets!"</span><span class="pun">}</span></pre>

<p>
	تُستخدم الصيغ <code>{}Q%</code> و <code>{}q%</code> أحيانًا أيضًا لتعريف السلاسل النصية في روبي، وتعمل صيغة <code>{}Q%</code> بالضبط مثل صيغة علامات الاقتباس المزدوجة، ما يعني عدم الحاجة للهروب من علامات الاقتباس المزدوجة داخل السلسلة النصية وإمكانية تضمين القيم داخل السلسلة النصية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_79" style=""><span class="pln">droplets </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
print </span><span class="pun">%</span><span class="pln">Q</span><span class="pun">{</span><span class="typ">Sammy</span><span class="pln"> says</span><span class="pun">,</span><span class="pln"> </span><span class="str">"I just created #{droplets} droplets!"</span><span class="pun">}</span></pre>

<p>
	أما صيغة <code>{}q%</code> فهي بديلة لصيغة علامات الاقتباس المفردة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_81" style=""><span class="pun">%</span><span class="pln">q</span><span class="pun">{</span><span class="typ">Sammy</span><span class="pln"> says</span><span class="pun">,</span><span class="pln"> </span><span class="str">"I'm a happy shark!"</span><span class="pun">}</span></pre>

<p>
	يُستخدم أحيانًا مع الصيغتين <code>{}q%</code> و <code>{}Q%</code> الأقواس الهلالية أو الأقواس المعقوفة بدلًا من الأقواس المعقوصة، وكما نلاحظ توفر روبي العديد من الطرق لإنشاء السلاسل النصية ويفضل استخدام صيغة تعريف موحدة ضمن الشيفرة ككل، وتفي غالبًا كلًا من الصيغتين <code>{}Q%</code> و <code>{}q%</code> بالغرض. الآن، بعد أن تعرفنا على طرق التعامل مع المحارف الخاصة سنتعرف في الفقرة التالية طريقة التعامل مع السلاسل النصية الطويلة والتي تمتد إلى عدة أسطر.
</p>

<h2>
	السلاسل النصية الطويلة والأسطر الجديدة
</h2>

<p>
	لإدراج سطر جديد ضمن سلسلة نصية ما يمكن استخدام محرف السطر الجديد <code>n\</code>، أو المحرف <code>r\</code> الذي يدل على عودة المؤشر لبداية السطر وهو مفهوم أتى من أنظمة ويندوز القديمة التي كانت تحاكي طريقة الكتابة في الآلات الكاتبة اليدوية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_83" style=""><span class="pln">output </span><span class="pun">=</span><span class="pln"> </span><span class="str">"This is\na string\nwith newlines"</span><span class="pln">
puts output</span></pre>

<p>
	عند طباعة السلسلة النصية السابقة نلاحظ النزول إلى سطر جديد عند كل ورود للمحرف <code>n\</code>:
</p>

<pre class="ipsCode">This is
a string
with newlines
</pre>

<p>
	توفر لنا هذه الطريقة إمكانية طباعة نص متعدد الأسطر، ولكن في حال كان النص طويلًا سيمتد على سطر واحد طويل وسيصعب قراءته والتعامل معه، ويمكن حل تلك المشكلة بعدة طرق، إذ يمكن استخدام ميزة دمج السلاسل النصية لكتابة النص الطويل على أجزاء كلًّا بسطر ضمن الشيفرة المصدرية للبرنامج:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_85" style=""><span class="pln">output </span><span class="pun">=</span><span class="pln"> </span><span class="str">"This is a\n"</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
</span><span class="str">"longer string\n"</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
</span><span class="str">"with newlines."</span><span class="pln">
puts output</span></pre>

<p>
	يمكن أيضًا وضع الأسطر الجديدة مباشرةً داخل النص المكتوب دون الحاجة لاستخدام المحارف الخاصة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_87" style=""><span class="pln">output </span><span class="pun">=</span><span class="pln"> </span><span class="str">"This is a
longer string
with newlines"</span><span class="pln">
puts output</span></pre>

<p>
	وهذه الطريقة ممكنة أيضًا عند استخدام أي صيغة بديلة لتعريف السلاسل النصية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_89" style=""><span class="pln">output </span><span class="pun">=</span><span class="pln"> </span><span class="pun">%{</span><span class="typ">This</span><span class="pln"> is a
longer string
with newlines</span><span class="pun">}</span><span class="pln">
puts output</span></pre>

<p>
	نلاحظ عدم الحاجة لاستخدام المحرف <code>n\</code> لإدراج سطر جديد، كما أن هذه الطريقة ستحافظ على المسافات البيضاء متضمنةً بداية الأسطر والأسطر الجديدة أيضًا:
</p>

<pre class="ipsCode">This is a
longer string
with newlines
</pre>

<p>
	ولمنع ذلك يجب إزالة المسافات البيضاء الإضافية في بداية الأسطر ضمن الشيفرة كي لا تكون جزءًا من النص نفسه كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_93" style=""><span class="pln">output </span><span class="pun">=</span><span class="pln"> </span><span class="pun">%{</span><span class="typ">This</span><span class="pln"> is a
longer string
with newlines
</span><span class="pun">}</span></pre>

<p>
	يمكن أيضًا إنشاء سلاسل نصية متعددة الأسطر باستخدام صيغة تسمى <a href="https://ar.wikipedia.org/wiki/%D8%AA%D9%88%D8%AB%D9%8A%D9%82_%D9%87%D9%8A%D8%B1" rel="external nofollow">heredoc</a> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_95" style=""><span class="pln">output </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&lt;&lt;-</span><span class="kwd">END</span><span class="pln">
</span><span class="typ">This</span><span class="pln"> is a
longer string
with newlines
</span><span class="kwd">END</span></pre>

<p>
	تدل العلامتان <code>END-&gt;&gt;</code> و <code>END</code> على بداية ونهاية السلسلة النصية وتحافظ هذه الصيغة على المسافات البيضاء في بداية الأسطر، فإذا أردنا كتابة شيفرة برمجية مُنسقة مثلًا بداخلها فتنسيق تلك الشيفرة سيبقى كما هو وتبقى واضحة القراءة كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_97" style=""><span class="pln">output </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&lt;&lt;-</span><span class="kwd">END</span><span class="pln">
</span><span class="typ">This</span><span class="pln"> is a
longer string
with newlines
</span><span class="kwd">END</span></pre>

<p>
	سيُحتفظ بالمسافتين في بداية كل سطر في المثال السابق.
</p>

<p>
	تتوفر في روبي 2.3 والإصدارات الأحدث صيغةً تسمى "squiggly heredoc"، والتي تزيل تلك المسافات تلقائيًا من بداية الأسطر، وصيغتها تكون بتبديل الشرطة hyphen <code>-</code> بالعلامة تيلدا tilde <code>~</code> لتصبح بداية السلسلة النصية هي <code>~&gt;&gt;</code> بدلًا من <code>-&gt;&gt;</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_99" style=""><span class="pln">output </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&lt;&lt;~</span><span class="kwd">END</span><span class="pln">
</span><span class="typ">This</span><span class="pln"> is a
longer string
with newlines
</span><span class="kwd">and</span><span class="pln"> the code is indented
but the output is </span><span class="kwd">not</span><span class="pun">.</span><span class="pln">
</span><span class="kwd">END</span></pre>

<p>
	لينتج لدينا الخرج التالي:
</p>

<pre class="ipsCode">This is a
longer string
with newlines
and the code is indented
but the output is not.
</pre>

<p>
	تدعم هذه الطريقة في روبي أيضًا ميزة تضمين قيم المتغيرات داخل السلاسل النصية، وكما لاحظنا هناك العديد من الطرق للتعامل مع الأسطر الجديدة والسلاسل النصية متعددة الأسطر في روبي، ويُفضل توحيد استخدام إحدى تلك الطرق ضمن الشيفرة البرمجية.
</p>

<h2>
	تكرار السلسلة النصية
</h2>

<p>
	نحتاج أحيانًا لتكرار سلسلة نصية ما عدة مرات، وتوفر روبي لذلك معامل الضرب <code>*</code>، والذي على العكس من معامل الجمع <code>+</code> فيمكن استخدامه مع الأعداد الصحيحة لتحديد مرات تكرار السلسلة النصية التي تسبقه، فمثلًا لطباعة السلسلة النصية "Sammy" تسع مرات يمكن ضرب هذه السلسلة النصية بالعدد 9 على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_101" style=""><span class="pln">print </span><span class="str">"Sammy"</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">9</span></pre>

<p>
	لينتج الخرج التالي:
</p>

<pre class="ipsCode">SammySammySammySammySammySammySammySammySammy
</pre>

<p>
	تفيد هذه الميزة للرسم باستخدام المحارف، لنرسم صندوقًا يحيط بعبارة ما على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4534_103" style=""><span class="pln">puts </span><span class="str">"="</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">15</span><span class="pln">
puts </span><span class="str">"| Hello World |"</span><span class="pln">
puts </span><span class="str">"="</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">15</span></pre>

<p>
	نلاحظ كيف استفدنا من تكرار السطر العلوي والسفلي لرسم مربع يحيط بالعبارة والتي سينتج عنها التالي:
</p>

<pre class="ipsCode">===============
| Hello World |
===============
</pre>

<h2>
	الخاتمة
</h2>

<p>
	تعرفنا في هذا المقال على السلاسل النصية في لغة روبي بالتفصيل، والطرق المختلفة للتعامل معها بدءًا من إنشاءها وصولًا إلى دمجها معًا وإدراج القيم بداخلها وطرق كتابة المحارف الخاصة مثل علامات الاقتباس فيها والأسطر الجديدة نهايةً بتكرار السلسة النصية لعدد من المرات، إذ تُعد السلاسل النصية من الأفكار المهمة في <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a> ويجب احتراف التعامل معها لحل العديد من المشاكل وتطوير البرامج.
</p>

<p>
	لمزيد من التفصيل، ارجع إلى صفحة <a href="https://wiki.hsoub.com/Ruby/String" rel="external">النوع String</a> في موسوعة حسوب.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-work-with-strings-in-ruby" rel="external nofollow">How To Work with Strings in Ruby</a> لصاحبه Brian Hogan.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/ruby/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-data-types-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2138/" rel="">أنواع البيانات في لغة روبي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%A8%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2115/" rel="">كتابة أول برنامج بلغة روبي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D9%88%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r254/" rel="">السلاسل والمتغيرات في روبي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2139</guid><pubDate>Sun, 08 Oct 2023 13:00:00 +0000</pubDate></item><item><title>&#x623;&#x646;&#x648;&#x627;&#x639; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; Data Types &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-data-types-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2138/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_10/----.png.b91402e1c28ed35ab0494684f0a451f6.png" /></p>
<p>
	تُصنف البيانات في لغات البرمجة إلى عدة أنواع يستدل الحاسوب بها للتعامل مع تلك البيانات أثناء تنفيذ البرامج، مثل تحديد العمليات الممكن تنفيذها على تلك البيانات، وهي تشبه إلى حد كبير أنواع البيانات التي نتعامل معها في حياتنا العادية، مثل أنواع الأعداد في الرياضيات، إذ توجد الأعداد الطبيعية مثل 0 و1 و2، والأعداد الصحيحة مثل -1 و0 و1، والأعداد غير الكسرية أو غير النسبية irrational numbers مثل π، بحيث يمكن جمع الأعداد من تلك الأنواع المختلفة مع بعضها لنحصل على نتيجة معينة، فمثلًا يمكن جمع العدد الطبيعي 5 مع العدد غير الكسري π:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_8" style=""><span class="lit">5</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">π</span></pre>

<p>
	يمكننا إبقاء المعادلة كما هي لإظهار العدد غير الكسري π، أو يمكننا تقريبه بعدد محدود من الأرقام العشرية ثم جمع تلك القيمتين معًا على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_10" style=""><span class="lit">5</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">π</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">3.14</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8.14</span></pre>

<p>
	لكن لا يمكن جمع نوعين مختلفين من البيانات، مثل الكلمات والأعداد مثلًا معًا:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_12" style=""><span class="pln">sky </span><span class="pun">+</span><span class="pln"> </span><span class="lit">8</span></pre>

<p>
	لا يمكن حل مثل تلك المعادلات وبالتالي لا يستطيع الحاسوب حلها أيضًا، فلا يمكن جمع بيانات من نوع كلمة مثل الكلمة "Sky" مع عدد طبيعي مثل العدد 8، لذا يجب الانتباه لنوع البيانات عند إسنادها لمتغيرات أو التعديل عليها وتنفيذ العمليات بينها مثل الجمع والطرح والضرب وغيرها. سنتعرف في هذا المقال على أهم أنواع البيانات الموجودة في لغة <a href="https://academy.hsoub.com/programming/ruby/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-ruby-r636/" rel="">روبي Ruby</a>، مثل الأعداد الصحيحة والعشرية والسلاسل النصية والرموز والمصفوفات وجداول Hash، وسنتعرف بعدها على مفهوم ديناميكية الأنواع dynamic typing والذي تعتمد عليه لغة روبي لتحديد نوع البيانات المُخزّنة ضمن المتغيرات والذي من الضروري فهمه لتجنب الأخطاء التي قد تقع خصوصًا أن المتغيرات يمكن أن تحتوي على قيمة من أي نوع من أنواع البيانات. سنتعرف في الفقرة التالية على أول نوع من البيانات وهو الأعداد الصحيحة وطرق التعامل معها في لغة روبي.
</p>

<h2>
	الأعداد الصحيحة integers
</h2>

<p>
	تشبه <a href="https://wiki.hsoub.com/Ruby/Integer" rel="external">الأعداد الصحيحة integers</a> في لغة روبي الأعداد الصحيحة في الرياضيات تمامًا، بحيث يمكن أن تحتوي على قيم أعداد موجبة أو سالبة أو تساوي الصفر، مثل الأعداد"1-" و"0" و"1"، ويمكن طباعتها على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_14" style=""><span class="pln">print </span><span class="pun">-</span><span class="lit">25</span></pre>

<p>
	ليكون الخرج ببساطة:
</p>

<pre class="ipsCode">-25
</pre>

<p>
	ويمكن تخزين العدد الصحيح ضمن متغير بإسناد قيمته إليه ثم طباعة ذلك المتغير على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_16" style=""><span class="pln">my_int </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">25</span><span class="pln">
print my_int</span></pre>

<p>
	ويكون الخرج:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_20" style=""><span class="pun">-</span><span class="lit">25</span></pre>

<p>
	يمكن تنفيذ العمليات الحسابية على الأعداد الصحيحة، مثل الجمع بين عددين وطباعة النتيجة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_18" style=""><span class="pln">sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">116</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">68</span><span class="pln">
print sum</span></pre>

<p>
	ويكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">48
</pre>

<p>
	ندرج عادةً الفاصلة "," بعد كل ثلاث خانات من الأعداد الكبيرة لتسهيل قراءتها فمثلًا نكتب العدد مليون "1000000" بإدراج الفواصل كما يلي: "1,000,000"، أما في لغة روبي لا يمكن استخدام هذه الفاصلة ضمن العدد، وتُستخدم علامة الشرطة السفلية <code>_</code> التي توفرها روبي لنفس الغرض وهو تسهيل قراءة الأعداد الكبيرة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_22" style=""><span class="pln">large_number </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1_234_567</span><span class="pln">
print large_number</span></pre>

<p>
	نلاحظ عند طباعة قيمة ذلك العدد لن تُطبع الشرطة السفلية <code>_</code>، وستُطبع قيمة العدد الصحيح فقط:
</p>

<pre class="ipsCode">1234567
</pre>

<p>
	سنتعرف في الفقرة التالية على نوع جديد من البيانات وهو الأعداد العشرية وطريقة التعامل معها.
</p>

<h2>
	الأعداد العشرية floating-point number
</h2>

<p>
	تُمثل <a href="https://wiki.hsoub.com/Ruby/Float" rel="external">الأعداد العشرية floating-point number</a> أعدادًا حقيقية مثل الأرقام الكسرية أو غير الكسرية، وهي التي تحتوي على جزء عشري مثل العدد "9.0" أو "116.42-". يمكن طباعة الأعداد العشرية في لغة روبي تمامًا مثل طريقة طباعة الأعداد الصحيحة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_24" style=""><span class="pln">print </span><span class="lit">17.3</span></pre>

<p>
	ويكون الخرج على النحو التالي:
</p>

<pre class="ipsCode">17.3
</pre>

<p>
	يمكن أيضًا تعريف متغير وإسناد قيمة عشرية إليه كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_26" style=""><span class="pln">my_float </span><span class="pun">=</span><span class="pln"> </span><span class="lit">17.3</span><span class="pln">
print my_float</span></pre>

<p>
	ليعطي الخرج التالي:
</p>

<pre class="ipsCode">17.3
</pre>

<p>
	وكما هو الحال مع الأعداد الصحيحة، يمكن تنفيذ العمليات الحسابية على الأعداد العشرية أيضًا على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_28" style=""><span class="pln">sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">564.0</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">365.24</span><span class="pln">
print sum</span></pre>

<p>
	ويكون الخرج:
</p>

<pre class="ipsCode">929.24
</pre>

<p>
	ناتج جمع عدد عشري مع عدد صحيح في لغة روبي هو عدد عشري:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_30" style=""><span class="pln">sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">564</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">365.24</span><span class="pln">
print sum</span></pre>

<p>
	ويكون الخرج:
</p>

<pre class="ipsCode">929.24
</pre>

<p>
	سنتعرف في الفقرة التالية على نوع مهم من <a href="https://academy.hsoub.com/programming/general/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r1726/" rel="">أنواع البيانات</a> في لغة روبي وهي البيانات البوليانية.
</p>

<h2>
	البيانات البوليانية boolean
</h2>

<p>
	تُستخدم أنواع البيانات البوليانية boolean لتمثيل القيم المتعلقة بالمنطق الرياضي والتي تُستخدم لتطوير <a href="https://academy.hsoub.com/programming/advanced/%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA/" rel="">الخوارزميات في علم الحاسوب</a>، إذ يُمثّل هذا النوع من البيانات في لغة روبي إما بالقيمة الصحيحة<code>true</code> أو القيمة الخاطئة<code>false</code>، إذ تنتج تلك القيم عن العديد من العمليات الرياضية مثل العمليات البوليانية التالية:
</p>

<ul>
	<li>
		أكبر من
		<ul>
			<li>
				500 &gt; 100 صحيح <code>true</code>
			</li>
			<li>
				1 &gt; 5 خاطئ <code>false</code>
			</li>
		</ul>
	</li>
	<li>
		أصغر من
		<ul>
			<li>
				200 &lt; 400 صحيح <code>true</code>
			</li>
			<li>
				4 &lt; 2 خاطئ <code>false</code>
			</li>
		</ul>
	</li>
	<li>
		المساواة
		<ul>
			<li>
				5 = 5 صحيح <code>true</code>
			</li>
			<li>
				500 = 400 خاطئ <code>false</code>
			</li>
		</ul>
	</li>
</ul>

<p>
	كما هو الحال أنواع البيانات السابقة، يمكننا تخزين القيم المنطقية<code>true</code> أو <code>false</code> ضمن متغير:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_32" style=""><span class="pln">result </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">8</span></pre>

<p>
	نستخدم التابع<code>()print</code> كما فعلنا سابقًا لطباعة قيمة المتغير البولياني:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_34" style=""><span class="pln">print result</span></pre>

<p>
	بما أن العدد 5 ليس أكبر من العدد 8، ستظهر النتيجة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_36" style=""><span class="kwd">false</span></pre>

<p>
	البيانات البوليانية من أنواع البيانات الشائع استخدامها في لغة روبي ومعظم اللغات البرمجية الأخرى، وسنتعامل معها في هذه السلسلة وسنرى كيف يمكن أن تعيد التوابع والعمليات المختلفة القيم إما <code>true</code> أو <code>false</code> وكيف نستخدم هذه القيم للتحكم بمسار تنفيذ البرنامج، وسنتعرف في الفقرة التالية على السلاسل النصية وطريقة التعامل معها.
</p>

<h2>
	السلاسل النصية strings
</h2>

<p>
	تتكون <a href="https://wiki.hsoub.com/Ruby/String" rel="external">السلاسل النصية strings</a> من سلسلة من محرف واحد أو أكثر، والمحرف هو أي حرف أو رقم أو رمز، ويمكننا تعريف سلسلة نصية في لغة روبي بكتابة قيمتها ضمن علامتي اقتباس مفردة <code>'</code> أو مزدوجة <code>"</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_39" style=""><span class="str">"This is a string in double quotes."</span></pre>

<p>
	استخدمنا في مقال سابق السلاسل النصية عند <a href="https://academy.hsoub.com/programming/ruby/%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%A8%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2115/" rel="">كتابة أول برنامج بلغة روبي</a> لطباعة العبارة "!Hello, World" على الشاشة، إذ أن تلك القيمة هي سلسلة نصية تتكون من مجموعة من المحارف:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_41" style=""><span class="pln">print </span><span class="str">"Hello, World!"</span></pre>

<p>
	كما هو الحال مع الأنواع الأخرى من البيانات، فيمكن تخزين السلاسل النصية أيضًا في متغيرات:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_43" style=""><span class="pln">output </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello, World!"</span></pre>

<p>
	ويمكن طباعة النص المخزن في المتغير باستخدام اسم المتغير على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_45" style=""><span class="pln">print output</span></pre>

<p>
	ليكون الخرج:
</p>

<pre class="ipsCode">Hello, World!
</pre>

<p>
	يمكن تنفيذ العديد من العمليات على السلاسل النصية -كما هو الحال بالنسبة للأرقام- للتعديل عليها، وتكمن أهمية هذا النوع من البيانات بأنه طريقة للتواصل النصي بين المستخدم والبرنامج. سنتعرف في الفقرة التالية على نوع جديد من البيانات وهو المصفوفات التي تفيدنا في التعامل مع قائمة من البيانات.
</p>

<h2>
	المصفوفات arrays
</h2>

<p>
	<a href="https://wiki.hsoub.com/Ruby/Array" rel="external">المصفوفة array</a> هي نوع من البيانات يُمكّننا من تخزين مجموعة من القيم داخله نسميها عناصر تلك المصفوفة، ويمكن تعريف المصفوفة بكتابة قيم عناصرها بين أقواس مربعة <code>[ ]</code> والفصل بينها بالفاصلة <code>,</code>، فمثلًا لتعريف مصفوفة من الأرقام الصحيحة نكتب التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_47" style=""><span class="pun">[-</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">]</span></pre>

<p>
	أو مصفوفة من الأعداد العشرية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_49" style=""><span class="pun">[</span><span class="lit">3.14</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9.23</span><span class="pun">,</span><span class="pln"> </span><span class="lit">111.11</span><span class="pun">,</span><span class="pln"> </span><span class="lit">312.12</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1.05</span><span class="pun">]</span></pre>

<p>
	أو مصفوفة من السلاسل النصية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_51" style=""><span class="pun">[</span><span class="str">'shark'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'cuttlefish'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'squid'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'mantis shrimp'</span><span class="pun">]</span></pre>

<p>
	وكما هو الحال مع أنواع البيانات الأخرى يمكننا تخزين قيمة المصفوفة ضمن متغير:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_53" style=""><span class="pln">sea_creatures </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'shark'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'cuttlefish'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'squid'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'mantis shrimp'</span><span class="pun">]</span></pre>

<p>
	وعند طباعة قيمة أي مصفوفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_55" style=""><span class="pln">print sea_creatures</span></pre>

<p>
	سيظهر شكلها تمامًا كما هي عند تعريفها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_57" style=""><span class="pun">[</span><span class="str">'shark'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'cuttlefish'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'squid'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'mantis shrimp'</span><span class="pun">]</span></pre>

<p>
	يمكن الوصول إلى عنصر من عناصر أي مصفوفة باستخدام رقم الفهرس لذلك العنصر، وهو عدد يشير لترتيب ذلك العنصر ضمن المصفوفة ويبدأ من الصفر:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_59" style=""><span class="pln">puts sea_creatures</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="com"># shark</span><span class="pln">
puts sea_creatures</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="com"># squid</span></pre>

<p>
	للوصول إلى قيمة آخر عنصر من المصفوفة نستخدم رقم الفهرس السالب <code>1-</code>، كما توفر لغة روبي التابع<code>first.</code>، الذي يعيد أول عنصر من المصفوفة، والتابع <code>last.</code> الذي يعيد آخر عنصر منها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_61" style=""><span class="pln">puts sea_creatures</span><span class="pun">.</span><span class="pln">first </span><span class="com"># shark</span><span class="pln">
puts sea_creatures</span><span class="pun">.</span><span class="pln">last </span><span class="com"># mantis shrimp</span></pre>

<p>
	يمكن لعناصر المصفوفة الواحدة أن تكون بأنواع مختلفة من البيانات، فمثلًا يمكن تخزين سلاسل نصية ورموز وحتى مصفوفات أخرى ضمن مصفوفة واحدة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_63" style=""><span class="pln">record </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
</span><span class="pun">:</span><span class="pln">en</span><span class="pun">,</span><span class="pln">
</span><span class="str">"Sammy"</span><span class="pun">,</span><span class="pln">
</span><span class="lit">42</span><span class="pun">,</span><span class="pln">
</span><span class="pun">[</span><span class="pln">
</span><span class="str">"coral"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"reef"</span><span class="pln">
</span><span class="pun">]</span><span class="pln">
</span><span class="pun">]</span></pre>

<p>
	تتمتع المصفوفات في لغة روبي بخاصية التعديل؛ أي يمكن إضافة عناصر جديدة إليها، أو حذف عناصر منها، أو تعديل قيم العناصر المخزنة فيها. سنتعرف في الفقرة التالية على نوع جديد من البيانات وهو الرموز والتي تساعدنا في تسمية الأشياء ضمن البرنامج.
</p>

<h2>
	الرموز Symbol
</h2>

<p>
	<a href="https://wiki.hsoub.com/Ruby/Symbol" rel="external">الرمز Symbol</a> هو نوع خاص من البيانات يُستخدم مثل اسم أو معرّف داخل برنامج روبي، وتتميز الرموز بأن قيمتها ثابتة ولا يمكن تعديلها بعد تعريفها، وتشبه طريقة تعريف الرمز طريقة تعريف أي متغير ولكن دون تعيين قيمة له وإضافة محرف النقطتين <code>:</code> قبل اسمه على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_65" style=""><span class="pun">:</span><span class="pln">time_zone</span></pre>

<p>
	نستخدم الرموز في لغة روبي لتسمية بعض الأشياء الهامة ضمن البرنامج، بينما نستخدم السلاسل النصية للنصوص التي نحتاج لتعديلها أو العمل عليها، إذ أن كل سلسلة نصية في روبي هي كائن جديد منفصل مخزن ضمن موقع منفصل في الذاكرة حتى لو تطابقت قيمها مع بعضها، بينما تتشارك الرموز المتطابقة بالقيمة بكونها كائن واحد مخزن في نفس المكان في الذاكرة. سنتعرف أكثر على استخدامات الرموز في الفقرة التالية عندما نتعرف على جداول Hash والتي تسمح لنا بربط مفاتيح بقيمها.
</p>

<h2>
	جداول Hash
</h2>

<p>
	<a href="https://academy.hsoub.com/programming/ruby/%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D8%A7%D9%84%D8%AA%D9%82%D8%B7%D9%8A%D8%B9-hash-tables-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r282/" rel="">جدول Hash</a> هو مجموعة من أزواج المفاتيح والقيم تفيد في تخزين البيانات وتسمية كل منها وتسهيل الوصول إليها، ونستخدمها عادةً لتخزين بيانات متعلقة بشيء ما مثل بيانات شخص أو مستخدم، وتكون صيغة تعريفها على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_67" style=""><span class="pun">{</span><span class="str">"first_name"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Sammy"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"last_name"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Shark"</span><span class="pun">}</span></pre>

<p>
	يمكن تخزين <a href="https://wiki.hsoub.com/Ruby/Hash" rel="external">جدول Hash</a> ضمن متغير بنفس طريقة إسناد الأنواع الأخرى من البيانات:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_69" style=""><span class="pln">user </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="str">"first_name"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Sammy"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"last_name"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Shark"</span><span class="pun">}</span></pre>

<p>
	للوصول لقيمة ما من جدول Hash، نستخدم اسم المفتاح الخاص بتلك القيمة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_71" style=""><span class="pln">print user</span><span class="pun">[</span><span class="str">"first_name"</span><span class="pun">]</span><span class="pln"> </span><span class="com"># "Sammy"</span><span class="pln">
print user</span><span class="pun">[</span><span class="str">"last_name"</span><span class="pun">]</span><span class="pln"> </span><span class="com"># "Shark"</span></pre>

<p>
	يمكن استخدام الرموز مثل مفاتيح للقيم ضمن جدول Hash بدلًا من السلاسل النصية على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_73" style=""><span class="pln">user </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{:</span><span class="pln">first_name </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Sammy"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">:</span><span class="pln">last_name </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Shark"</span><span class="pun">}</span></pre>

<p>
	يفضل دائمًا استخدام الرموز مثل مفاتيح للجداول لتقليل استخدام الذاكرة وتحسين الأداء، نظرًا لأن كل الرموز المتساوية بالقيمة تتشارك الكائن نفسه والقيمة نفسها ضمن الذاكرة، بينما سيولد لكل سلسلة نصية كائن جديد وفريد وبمكان جديد في الذاكرة، ويمكن الوصول للقيمة المقابلة لرمز ما ضمن جدول Hash باستخدام الرمز نفسه على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_75" style=""><span class="pln">print user</span><span class="pun">[:</span><span class="pln">first_name</span><span class="pun">]</span><span class="pln"> </span><span class="com"># "Sammy"</span><span class="pln">
print user</span><span class="pun">[:</span><span class="pln">last_name</span><span class="pun">]</span><span class="pln"> </span><span class="com"># "Shark"</span></pre>

<p>
	يمكن تعريف جدول Hash بالصيغة التالية أيضًا:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_77" style=""><span class="pln">user </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">first_name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Sammy"</span><span class="pun">,</span><span class="pln"> last_name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Shark"</span><span class="pun">}</span></pre>

<p>
	تشبه هذه الصيغة الصيغة المستخدمة في لغة جافا سكريبت ولغات أخرى لتعريف الكائنات، وتُعرَّف المفاتيح في هذه الصيغة مثل رموز، أي يمكن الوصول للقيم في المثال السابق باستخدام الرموز <code>first_name:</code> و <code>last_name:</code> بدلًا من السلاسل النصية <code>"first_name"</code> و <code>"last_name"</code>. الآن، بعد أن تعرفنا على العديد من أنواع البيانات في لغة روبي سنتعرف في الفقرة التالية كيف يتعامل روبي معها.
</p>

<h2>
	لغة روبي ديناميكية الأنواع
</h2>

<p>
	تمتاز لغة روبي بأنها ديناميكية الأنواع dynamic typing، أي لا يُعرّف نوع البيانات صراحةً عند إسناد قيمتها إلى متغير، بل يُحدّد نوع البيانات تلقائيًا بحسب القيمة التي خُزّنت فيه، مما يعني أن عملية فحص النوع ستجري خلال وقت التشغيل للبرنامج وليس في وقت الترجمة كما هو الحال في اللغات التي تكون ثابتة الأنواع static typing، وهناك عدة لغات شهيرة تستخدم نفس الطريقة مثل لغة <a href="https://academy.hsoub.com/python" rel="">بايثون</a> ولغة <a href="https://academy.hsoub.com/javascript/" rel="">جافا سكريبت</a>.
</p>

<p>
	تتيح ديناميكية الأنواع إمكانية إسناد قيمة للمتغير <code>t</code> التالي مثلًا من أي نوع من أنواع البيانات المتاحة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_79" style=""><span class="pln">t </span><span class="pun">=</span><span class="pln"> </span><span class="lit">42</span><span class="pln"> </span><span class="com"># t is an Integer</span><span class="pln">
t </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sammy"</span><span class="pln"> </span><span class="com"># t is a String</span><span class="pln">
t </span><span class="pun">=</span><span class="pln"> </span><span class="pun">:</span><span class="pln">sammy </span><span class="com"># t is a Symbol</span><span class="pln">
t </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pln"> </span><span class="com"># t is a boolean (true)</span><span class="pln">
t </span><span class="com"># t is nil</span></pre>

<p>
	كما تتيح هذه الميزة إمكانية تعديل القيمة المُخزنة ضمن المتغير نفسه وإسناد قيمة جديدة من نوع بيانات مختلف، ففي المثال التالي سنطلب من المستخدم إدخال قيمة عددية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_81" style=""><span class="pln">print </span><span class="str">"Please enter the length of the room: "</span><span class="pln">
length </span><span class="pun">=</span><span class="pln"> gets</span><span class="pun">.</span><span class="pln">chop</span></pre>

<p>
	وبما أن القيمة التي سيدخلها المستخدم من لوحة المفاتيح ستكون من نوع سلسلةً نصيةً دائمًا، فيجب تحويلها إلى عدد أولًا قبل إجراء العمليات الحسابية عليها، ففي اللغات ثابتة الأنواع static typing سنضطر لتعريف نوع البيانات ضمن المتغير قبل إسناد القيمة له، وبذلك علينا إنشاء متغير جديد بنوع بيانات مناسب لتخزين قيمة البيانات بعد تحويلها ولن نتمكن من إعادة استخدام نفس المتغير، ولكن في لغة روبي وبما أنها ديناميكية الأنواع فذلك ممكن على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_83" style=""><span class="com"># Convert the amount to a Float.</span><span class="pln">
length </span><span class="pun">=</span><span class="pln"> length</span><span class="pun">.</span><span class="pln">to_f</span></pre>

<p>
	استخدمنا التابع <code>to_f</code> لتحويل قيمة السلسلة النصية إلى عدد عشري، كما يوجد التابع <code>to_i</code> لتحويل قيمة السلسلة النصية إلى عدد صحيح، ويمكن تحويل أغلب الكائنات في روبي إلى سلاسل نصية باستخدام التابع<code>to_s</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_85" style=""><span class="lit">42.to</span><span class="pln">_s </span><span class="com"># "42"</span><span class="pln">
</span><span class="pun">(</span><span class="lit">42.5</span><span class="pun">).</span><span class="pln">to_s </span><span class="com"># "42.5"</span><span class="pln">
</span><span class="pun">[</span><span class="str">"Sammy"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Shark"</span><span class="pun">].</span><span class="pln">to_s </span><span class="com"># "[\"Sammy\", \"Shark\"]"</span></pre>

<p>
	لا تعني ديناميكية الأنواع إمكانية تنفيذ العمليات بين أنواع البيانات المختلفة دون تحويلها إلى نفس النوع أولًا، فمثلًا سينتج عند جمع سلسلة نصية مع عدد صحيح:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_87" style=""><span class="pln">print </span><span class="lit">5</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"5"</span></pre>

<p>
	الخطأ التالي في الخرج:
</p>

<pre class="ipsCode">TypeError: String can't be coerced into Integer
</pre>

<p>
	حتى لو نفذنا نفس العملية بعكس ترتيب القيم:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_89" style=""><span class="pln">print </span><span class="str">"5"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">5</span></pre>

<p>
	سينتج خطأ أيضًا:
</p>

<pre class="ipsCode">TypeError: no implicit conversion of Integer into String
</pre>

<p>
	لحل هذه المشكلة يجب تحويل السلسلة النصية إلى عدد صحيح أولًا ثم جمعها للحصول على النتيجة <code>10</code>، أما إذا أردنا دمجهما معًا مثل سلاسل نصية للحصول على السلسلة النصية "55" فيجب تحويل العدد إلى سلسلة نصية قبل جمعه. من مزايا اللغات ديناميكية الأنواع المرونة في استخدام البيانات والتعامل مع المتغيرات، ولكن العيب الوحيد في ذلك هو عدم القدرة على تحديد نوع البيانات المخزن ضمن متغير ما قد جرى التعديل عليه، ولحل هذه المشكلة توفر روبي طرقًا لتحديد نوع بيانات أي قيمة مستخدمة سنتعرف عليها في الفقرة التالية.
</p>

<h2>
	تحديد أنواع البيانات
</h2>

<p>
	معظم القيم في لغة روبي هي كائنات، فالأعداد الصحيحة والعشرية والمصفوفات والرموز وجداول Hash كلها كائنات في روبي، ويحتوي كل منها على تابع يسمى <code>class</code> يعيد عند استدعائه نوع ذلك الكائن، وحتى القيم المنطقية <code>true</code> و <code>false</code> والقيمة <code>nil</code> كائنات أيضًا:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_91" style=""><span class="lit">42.class</span><span class="pln"> </span><span class="com"># Integer</span><span class="pln">
</span><span class="pun">(</span><span class="lit">42.2</span><span class="pun">).</span><span class="kwd">class</span><span class="pln"> </span><span class="com"># Float</span><span class="pln">
</span><span class="pun">[</span><span class="str">"Sammy"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Shark"</span><span class="pun">].</span><span class="kwd">class</span><span class="pln"> </span><span class="com"># Array</span><span class="pln">
</span><span class="kwd">true</span><span class="pun">.</span><span class="kwd">class</span><span class="pln"> </span><span class="com"># TrueClass</span><span class="pln">
</span><span class="kwd">nil</span><span class="pun">.</span><span class="kwd">class</span><span class="pln"> </span><span class="com"># NilClass</span></pre>

<p>
	كما يمكن استخدام تابع <code>?kind_of</code> للتحقق من نوع البيانات على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_93" style=""><span class="lit">42.kind</span><span class="pln">_of</span><span class="pun">?(</span><span class="typ">Integer</span><span class="pun">)</span><span class="pln"> </span><span class="com"># true</span></pre>

<p>
	نستفيد من ذلك للتعرف على نوع البيانات المُخزنة ضمن متغير ما:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_95" style=""><span class="com"># نوع القيمة المسندة واضح عند التعريف</span><span class="pln">
sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">]</span><span class="pln">
</span><span class="pun">...</span><span class="pln">
</span><span class="com"># لكنه غير واضح في أماكن أخرى من البرنامج</span><span class="pln">

sharks</span><span class="pun">.</span><span class="pln">kind_of</span><span class="pun">?(</span><span class="typ">Hash</span><span class="pun">)</span><span class="pln"> </span><span class="com"># false</span><span class="pln">
sharks</span><span class="pun">.</span><span class="pln">kind_of</span><span class="pun">?(</span><span class="typ">Array</span><span class="pun">)</span><span class="pln"> </span><span class="com"># true</span></pre>

<p>
	يمكن استخدام هذه الطريقة أيضًا للتحقق من صحة البيانات القادمة من مصدر خارجي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_97" style=""><span class="kwd">if</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">kind_of</span><span class="pun">?</span><span class="pln"> </span><span class="typ">String</span><span class="pln">
data </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">to_f
</span><span class="kwd">end</span></pre>

<p>
	يوجد أيضًا التابع <code>?is_a</code> والذي له نفس وظيفة التابع <code>?kind_of</code> ولكنه أسهل بالقراءة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8997_99" style=""><span class="kwd">if</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">is_a</span><span class="pun">?</span><span class="pln"> </span><span class="typ">String</span><span class="pln">
data </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">to_f
</span><span class="kwd">end</span></pre>

<p>
	يساعد استخدام التوابع <code>class</code> و <code>?kind_of</code> و <code>?is_a</code> في التأكد من النوع الصحيح للبيانات الذي نتعامل معه، وهناك طرق أخرى سنتعلمها لاحقًا تغني عن الحاجة للتحقق من نوع البيانات يدويًا.
</p>

<h2>
	الخاتمة
</h2>

<p>
	تعرفنا في هذا المقال على العديد من أنواع البيانات التي توفرها روبي، إذ يمكّننا فهم أنواع البيانات تلك ووظائفها من التعامل معها وإجراء العمليات عليها لتطوير البرامج المختلفة، وهي من الأفكار الأساسية في لغة روبي والعديد من لغات البرمجة الأخرى.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/understanding-data-types-in-ruby" rel="external nofollow">Understanding Data Types in Ruby</a> لصاحبه Brian Hogan.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%8A%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2117/" rel="">التعليقات في لغة روبي Ruby</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r1726/" rel="">دليلك الشامل إلى أنواع البيانات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87%D8%A7-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-r1287/" rel="">مدخل إلى البيانات وأنواعها: أنواع البيانات الأساسية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D9%88%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r254/" rel="">السلاسل والمتغيرات في روبي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2138</guid><pubDate>Mon, 02 Oct 2023 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x644;&#x64A;&#x642;&#x627;&#x62A; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%8A%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2117/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_09/---.png.ef3ac24094a72687624b39c45b263328.png" /></p>
<p>
	التعليقات هي أسطر تتجاهلها المصرّفات compilers والمفسرات interpreters في البرامج الحاسوبية، ويمكننا الاستفادة من التعليقات لتوضيح البرامج للمبرمجين الآخرين عبر تفسير الشيفرات البرمجية ووظيفة كل جزء من البرنامج، إضافةً إلى استخدام التعليقات لشرح لماذا اخترتنا حلًا معينًا مثلًا، أو حتى لتعطيل جزء من البرنامج غير مكتمل ومنعه من التنفيذ مؤقتًا حتى إكماله أو إصلاحه. قد تبقى بعض التعليقات في الشيفرات البرمجية إلى الأبد مثل تلك التي تشرح السياق ضمن البرنامج، أو قد تكون مؤقتة مثل الملاحظات التي نتركها لأنفسنا أثناء تطوير البرنامج. سنتعرف في هذا المقال على طريقة استخدام التعليقات في برامج روبي لترك ملاحظات أو استخدامها مثل أداة لإصلاح الأخطاء.
</p>

<h2>
	صيغة التعليقات واستخدامها
</h2>

<p>
	تبدأ التعليقات في <a href="https://academy.hsoub.com/programming/ruby/" rel="">لغة روبي</a> بالعلامة (<code>#</code>) ويُعد السطر بعدها كله تعليق على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9977_8" style=""><span class="com"># سطر تعليق في روبي</span></pre>

<p>
	يُفضّل وضع مسافة فارغة بعد رمز التعليق لتوضيح التعليق رغم أن ذلك ليس ضروريًا، وعند تنفيذ البرنامج فلن نلاحظ أي تغيير يدل على وجود التعليقات ضمن الشيفرة البرمجية، إذ يتجاهلها مفسّر روبي تمامًا لأنها موجودة لنقرأها نحن فقط وليس للحواسيب. يمكن الكتابة بأي لغة نريدها ضمن التعليقات مثل اللغة العربية أو الإنجليزية، ويُفضل اختيار اللغة المناسبة التي يفهمها كل من يعمل على المشروع، ويمكن استخدام التعليقات لتوضيح تفاصيل إضافية حول ما يحدث في كل جزء من الشيفرة البرمجية مثل الشيفرة التالية التي عملنا عليها في مقال سابق:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9977_10" style=""><span class="com"># عرض رسالة للمستخدم</span><span class="pln">
puts </span><span class="str">"Please enter your name."</span><span class="pln">

</span><span class="com"># (حفظ القيمة المدخلة وإزالة آخر حرف (محرف السطر الجديد</span><span class="pln">
name </span><span class="pun">=</span><span class="pln"> gets</span><span class="pun">.</span><span class="pln">chop

</span><span class="com"># طباعة النتيجة على الشاشة</span><span class="pln">
puts </span><span class="str">"Hi, #{name}! I'm Ruby!"</span></pre>

<p>
	نلاحظ أن تلك التعليقات توضح وظيفة كل جزء من البرنامج وكيف يعمل. يمر البرنامج التالي على عناصر المصفوفة ويعرض محتوياتها مثل قائمة بصيغة <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-html-r1702/" rel="">HTML</a>، ويمكن ملاحظة كيف أن التعليقات توضح ما تفعله الشيفرة أكثر:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9977_12" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'hammerhead'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'great white'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'dogfish'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'frilled'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'bullhead'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'requiem'</span><span class="pun">]</span><span class="pln">

</span><span class="com"># مع إضافة مسافات في بدايتها وأسطر جديدة HTML تحويل كل عنصر في المصفوفة إلى عنصر</span><span class="pln">
listitems </span><span class="pun">=</span><span class="pln"> sharks</span><span class="pun">.</span><span class="pln">map</span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">shark</span><span class="pun">|</span><span class="pln"> </span><span class="str">" &lt;li&gt;#{shark}&lt;/li&gt;\n"</span><span class="pun">}</span><span class="pln">

</span><span class="com"># المفتوحة، ثم طباعة مصفوفة عناصر القائمة &lt;ul&gt; طباعة</span><span class="pln">
print </span><span class="str">"&lt;ul&gt;\n#{listitems.join}&lt;/ul&gt;"</span></pre>

<p>
	استخدمنا في هذا المثال توابعًا قد تكون جديدة، مثل <code>map</code> و <code>join</code>. نلاحظ هنا فائدة التعليقات، إذ توضح عمل البرنامج والخرج الناتج. لنختبر الآن البرنامج بحفظه في ملف بالاسم "sharks.rb"، ثم تنفيذه.
</p>

<pre class="ipsCode">$ ruby sharks.rb
</pre>

<p>
	نلاحظ الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9977_15" style=""><span class="tag">&lt;ul&gt;</span><span class="pln">
</span><span class="tag">&lt;li&gt;</span><span class="pln">hammerhead</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;li&gt;</span><span class="pln">great white</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;li&gt;</span><span class="pln">dogfish</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;li&gt;</span><span class="pln">frilled</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;li&gt;</span><span class="pln">bullhead</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;li&gt;</span><span class="pln">requiem</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span></pre>

<p>
	نلاحظ عدم وجود التعليقات التي أضفناها، إذ يتجاهلها المفسّر تمامًا وكأنها غير موجودة؛ فدورها يقتصر على توضيح البرنامج وتساعدنا في توقع شكل الخرج عند التنفيذ، وهذا أفضل استخدام للتعليقات فهي ستساعد أي شخص يقرأها والذي قد يكون جديدًا على اللغة.
</p>

<p>
	يُفضل محاذاة التعليقات بنفس مستوى الإزاحة الخاص بالشيفرة التي تتعلق بها وتشرحها، فمثلًا عند شرح صنف ما تعريفه لا يحتوي على إزاحة نكتب التعليق الخاص بلا إزاحة أيضًا، والتعليقات الخاصة بالتوابع ضمن ذلك الصنف يجب أن تبدأ بنفس مستوى الإزاحة لكل تابع. لنلاحظ المثال التالي وهو للعبة <a href="https://en.wikipedia.org/wiki/Magic_8-Ball" rel="external nofollow">Magic 8-Ball</a> تعطي لنا إجابة عشوائية على السؤال الذي نطرحه، ونلاحظ أن التعليقات محاذية مع الشيفرة تشرحا في كل قسم:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9977_17" style=""><span class="com"># صنف اللعبة</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Eightball</span><span class="pln">

</span><span class="com"># إعداد الخيارات المتاحة</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> initialize
</span><span class="lit">@choices</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Yes"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"No"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"All signs point to yes"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Ask again later"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Don't bet on it"</span><span class="pun">]</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># اختيار خيار عشوائي من الخيارات المتاحة</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> shake
</span><span class="lit">@choices</span><span class="pun">.</span><span class="pln">sample
</span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> play
puts </span><span class="str">"Ask your question."</span><span class="pln">

</span><span class="com"># نتجاهل الدخل بما أننا لا نريده</span><span class="pln">
gets

</span><span class="com"># نُنشئ كائن جديد من صنف اللعبة ونستخدمه للإجابة</span><span class="pln">
game </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Game</span><span class="pun">.</span><span class="pln">new
answer </span><span class="pun">=</span><span class="pln"> game</span><span class="pun">.</span><span class="pln">shake
puts answer

</span><span class="com"># نسأل المستخدم في حال أراد إعادة اللعبة وتقييم الجواب</span><span class="pln">
puts </span><span class="str">"Want to try again? Press 'y' to continue or any other key to quit."</span><span class="pln">
answer </span><span class="pun">=</span><span class="pln"> gets</span><span class="pun">.</span><span class="pln">chop

</span><span class="kwd">if</span><span class="pln"> answer </span><span class="pun">==</span><span class="pln"> </span><span class="str">'y'</span><span class="pln">
play
</span><span class="kwd">else</span><span class="pln">
exit
</span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># بدء اللعبة لأول مرة</span><span class="pln">
play</span></pre>

<p>
	دور التعليقات الأساسي هو مساعدة المبرمجين، سواء كان المبرمج هو من كتب الشيفرة البرمجية، أو شخص آخر يستخدمها أو يعمل عليها، لذا يجب أن نعامل التعليقات تمامًا كما نعامل الشيفرة البرمجية من ناحية الاهتمام بها وتحديثها وتوضيحها وتنسيقها، إذ يضر وجود تعليق مبهم أو يشرح على نحوٍ خاطئ أكثر من عدم وجود ذلك التعليق من الأساس.
</p>

<p>
	في بداية رحلتك كمبرمج، ستكتب الكثير من التعليقات التي تساعدك في فهم ما تفعله، ولكن مع اكتساب المزيد من الخبرة سيتغير محتوى تعليقاتك لشرح سبب وجود الشيفرة البرمجية التي تحاول شرحها بدلًا من شرح الشيفرة نفسا أو طريقة عملها، وبذلك ستكوّن فكرةً عن دور الشيفرة وما تفعله بنظرة بسيطة عليها، إلا في حال كانت الشيفرة معقدة بعض الشيء، فمثلًا التعليق التالي يشرح الشيفرة نفسها وهو ليس مفيدًا في حال كنت تعرف لغة روبي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9977_19" style=""><span class="com"># على الشاشة"Hello World" يطبع العبارة</span><span class="pln">
print </span><span class="str">"Hello World"</span></pre>

<p>
	فهو يكرر شرح ما تفعله الشيفرة، ورغم أن وجوده لن يغير أو يؤثر في عمل البرنامج إلا أنه حشو زائد عن الحاجة ولا يضيف أي قيمة جديدة للمبرمج قارئ الشيفرة، ولكن قد نحتاج أحيانًا للاستفاضة عند كتابة تعليقات وإطالة الشرح على عدة أسطر ولن يكفي سطر واحد، وهذا ما توفره التعليقات الكتلية التي سنتعرف عليها في الفقرة التالية.
</p>

<h2>
	التعليقات الكتلية
</h2>

<p>
	يمكننا استخدام التعليقات الكتلية Block Comments لشرح الشيفرة المعقدة أو الشيفرة التي لا نتوقع أن يكون القارئ على دراية بها، إذ يشرح هذا النوع من التعليقات أجزاء أو كل الشيفرة التي تليها، وتكون بنفس محاذاتها، وكما هو الحال في التعليقات العادية، يبدأ كل سطر منها بالمحرف (<code>#</code>) يليه مسافة اختيارية للتوضيح، وتُكتب تلك الأسطر خلف بعضها، ففي المثال التالي تعليق كتلي من الشيفرة المصدرية لإطار العمل Sinatra، ونلاحظ كيف يشرح السياق للمطورين الآخرين وطريقة عمل هذه الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9977_21" style=""><span class="pun">...</span><span class="pln">
</span><span class="com"># Some Rack handlers (Thin, Rainbows!) implement an extended body object protocol, however,</span><span class="pln">
</span><span class="com"># some middleware (namely Rack::Lint) will break it by not mirroring the methods in question.</span><span class="pln">
</span><span class="com"># This middleware will detect an extended body object and will make sure it reaches the</span><span class="pln">
</span><span class="com"># handler directly. We do this here, so our middleware and middleware set up by the app will</span><span class="pln">
</span><span class="com"># still be able to run.</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExtendedRack</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="typ">Struct</span><span class="pun">.</span><span class="pln">new</span><span class="pun">(:</span><span class="pln">app</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> call</span><span class="pun">(</span><span class="pln">env</span><span class="pun">)</span><span class="pln">
result</span><span class="pun">,</span><span class="pln"> callback </span><span class="pun">=</span><span class="pln"> app</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">env</span><span class="pun">),</span><span class="pln"> env</span><span class="pun">[</span><span class="str">'async.callback'</span><span class="pun">]</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> result </span><span class="kwd">unless</span><span class="pln"> callback </span><span class="kwd">and</span><span class="pln"> async</span><span class="pun">?(*</span><span class="pln">result</span><span class="pun">)</span><span class="pln">
after_response </span><span class="pun">{</span><span class="pln"> callback</span><span class="pun">.</span><span class="pln">call result </span><span class="pun">}</span><span class="pln">
setup_close</span><span class="pun">(</span><span class="pln">env</span><span class="pun">,</span><span class="pln"> </span><span class="pun">*</span><span class="pln">result</span><span class="pun">)</span><span class="pln">
throw </span><span class="pun">:</span><span class="pln">async
</span><span class="kwd">end</span><span class="pln">
</span><span class="pun">...</span></pre>

<p>
	ومع أن التعليقات الكتلية مفيدة لشرح الشيفرة بتفصيل أكثر، إلا أنه يفضل تجنب كثرة استخدامها، فقد تكون مجرد تكرار وحشو إضافي زائد، وبدلًا منها علينا أن نثق بخبرة المبرمجين الآخرين لفهم شيفرات روبي بأنفسهم، إلا إذا كانت تٌكتب تلك التعليقات لجمهور محدد، فيجب أن يقتصر دور التعليقات في توضيح السياق والسبب في وجود الشيفرة وليس تكرار شرح عملها.
</p>

<p>
	توفر روبي أيضًا صيغةً أخرى لكتابة التعليقات الكتلية على عدة أسطر، ولكنها نادرة الاستخدام:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9977_23" style=""><span class="pun">=</span><span class="kwd">begin</span><span class="pln">
</span><span class="pun">تعليق</span><span class="pln"> </span><span class="pun">على</span><span class="pln"> </span><span class="pun">عدة</span><span class="pln"> </span><span class="pun">أسطر</span><span class="pln">
</span><span class="pun">يمكننا</span><span class="pln"> </span><span class="pun">استخدام</span><span class="pln"> </span><span class="pun">مثل</span><span class="pln"> </span><span class="pun">هذه</span><span class="pln"> </span><span class="pun">التعليقات</span><span class="pln"> </span><span class="pun">للكتابة</span><span class="pln"> </span><span class="pun">بأسطر</span><span class="pln"> </span><span class="pun">عدة</span><span class="pln">
</span><span class="pun">=</span><span class="kwd">end</span></pre>

<p>
	يبدأ التعليق بالكلمة <code>begin=</code> وينتهي بالكلمة <code>end=</code>، ويجب أن تكون تلك الكلمات في بداية السطر تمامًا دون مسافات قبلها، ولهذا السبب نادرًا ما تُستخدم، فلا يمكن محاذاتها سوى مع بداية السطر. توفّر روبي أيضًا نوعًا آخر وهو التعليقات السطرية والتي يمكن كتابتها مع الأسطر البرمجية سنتعرف عليها في الفقرة التالية.
</p>

<h2>
	التعليقات السطرية
</h2>

<p>
	يمكن كتابة هذا النوع من التعليقات على نفس سطر الشيفرة البرمجية وبعدها تمامًا، إذ تبدأ أيضًا بالمحرف (<code>#</code>)، ثم مسافة فارغة اختيارية للتوضيح على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9977_25" style=""><span class="pun">[تعليق</span><span class="pln"> </span><span class="pun">سطري</span><span class="pln"> </span><span class="pun">عن</span><span class="pln"> </span><span class="pun">الشيفرة</span><span class="pln"> </span><span class="com"># [الشيفرة البرمجية </span></pre>

<p>
	يجب استخدام التعليقات السطرية بحذر، لكنها مفيدة لشرح بعض الأجزاء المعقدة، أو غير الواضحة من الشيفرة، أو في حال احتمال نسيان وظيفة سطر معين في المستقبل، فمثلًا إذا لم يكن جميع من يعمل على المشروع بدراية كافية في مجال الرياضيات وتطبيقها في برامج روبي، فيمكننا شرح بعض الأجزاء والغاية منها، مثل الشرح التالي عن إنشاء عدد معقد ولكن بتعليق سطري:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9977_27" style=""><span class="pln">a</span><span class="pun">=</span><span class="typ">Complex</span><span class="pun">(</span><span class="lit">4</span><span class="pun">,</span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="com"># (4+3i)إنشاء العدد المعقد</span></pre>

<p>
	والتعليق التالي الذي يشرح سبب اختيارنا لحل ما:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9977_29" style=""><span class="pln">pi </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3.14159</span><span class="pln"> </span><span class="com"># حددنا عدد الخانات العشرية عن قصد في هذا البرنامج</span></pre>

<p>
	يفضل استخدام التعليقات السطرية عند الضرورة فقط لشرح سطر برمجي أو توفير إرشاد معين لمن يقرأ البرنامج.
</p>

<h2>
	استخدام التعليقات أثناء الاختبار
</h2>

<p>
	تعرّفنا في الفقرات السابقة على توظيف التعليقات لإضافة توثيق وشرح <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D9%84%D9%88%D8%A8-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%88%D8%AA%D8%AD%D9%82%D9%8A%D9%82-%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D9%82%D8%B1%D8%A7%D8%A1%D8%AA%D9%87%D8%A7-r1307/" rel="">للشيفرات البرمجية</a>، إذ يمكن استخدام ميزة التعليقات بوضع الرمز (<code>#</code>) في بداية أي سطر من الشيفرة لا نريد تنفيذه مؤقتًا، وذلك مفيدٌ أثناء تطوير واختبار أو تصحيح الأخطاء في البرنامج، فقد نواجه في بعض الأحيان مشاكلًا بعد إضافة أسطر جديدة من الشيفرة، ويمكننا لحصر سبب المشكلة تعليق بعض الأسطر المضافة حديثًا لمعرفة سبب الخطأ، إذ يمكننا مثلًا في مثال اللعبة السابق منع إعادة تشغيل اللعبة في حال كنا نختبر صحة عملية تقييم.
</p>

<p>
	يمكننا تعليق السطر من الشيفرة الذي يعيد تشغيل اللعبة مرةً أخرى لتعطيل تلك الميزة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9977_31" style=""><span class="pun">...</span><span class="pln">
</span><span class="com"># Prompt to restart the game and evaluate the answer.</span><span class="pln">
puts </span><span class="str">"Want to try again? Press 'y' to continue or any other key to quit."</span><span class="pln">
answer </span><span class="pun">=</span><span class="pln"> gets</span><span class="pun">.</span><span class="pln">chop

</span><span class="kwd">if</span><span class="pln"> answer </span><span class="pun">==</span><span class="pln"> </span><span class="str">'y'</span><span class="pln">
</span><span class="com"># play</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
exit
</span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">
</span><span class="pun">...</span></pre>

<p>
	يمكن استخدام تعليق الشيفرات أيضًا أثناء تجربتنا لحلول بديلة ومعاينتها، فقد ترغب مثلًا بتجربة الطرق المختلفة الممكنة للتعامل مع المصفوفات في روبي، فنعلِّق الطريقة الحالية ونكتب بعدها طريقة جديدة ما لاختبارها وتحديد الأفضل منها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9977_33" style=""><span class="pln">sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hammerhead"</span><span class="pun">]</span><span class="pln">

</span><span class="com"># for shark in sharks do</span><span class="pln">
</span><span class="com"># puts shark</span><span class="pln">
</span><span class="com"># end</span><span class="pln">

sharks</span><span class="pun">.</span><span class="pln">each </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">shark</span><span class="pun">|</span><span class="pln">
puts shark
</span><span class="kwd">end</span></pre>

<p>
	كما لاحظنا يفيد تعليق الشيفرات البرمجية في عملية تحديد الأخطاء وأثناء التطوير وتجربة حلول مختلفة، وذلك بتعليق أجزاء من البرنامج ومنعها من التنفيذ وتشغيله بصورةٍ نظامية ومعاينة الفرق.
</p>

<h2>
	الخاتمة
</h2>

<p>
	تعرفنا في هذا المقال على التعليقات في <a href="https://wiki.hsoub.com/Ruby" rel="external">لغة روبي</a> وطرق استخدامها والاستفادة منها لتوضيح قراءة الشيفرات البرمجية وفهمها من قبل المبرمجين العاملين عليها وحتى بمثابة ملاحظات مستقبلية للمبرمج الذي يكتب الشيفرة نفسه، مما يسهل العمل على المشروع أو البرنامج ويفيد كل من يعمل عليه، كما أنها تساعدك في فهم الشيفرة البرمجية عند الرجوع إليها بعد مدة طويلة ونسيان بعض التفاصيل والحلول المستخدمة.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-use-comments-in-ruby" rel="external nofollow">How To Use Comments in Ruby</a> لصاحبه Brian Hogan.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D8%A7%D9%81-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%A7%D9%84%D8%AA%D9%81%D8%A7%D8%B9%D9%84%D9%8A-irb-r2116/" rel="">استكشاف لغة روبي باستخدام البرنامج التفاعلي IRB</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r662/" rel="">دليل تعلم البرمجة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A8%D8%B3%D8%A7%D8%B7%D8%A9-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-r1870/" rel="">قواعد البرمجة ببساطة للمبتدئين</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%AF%D9%84%D9%8A%D9%84-%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-%D8%B1%D9%88%D8%A8%D9%8A-ruby-r886/" rel="">دليل تنسيق شيفرات روبي Ruby</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2117</guid><pubDate>Tue, 26 Sep 2023 13:02:01 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x643;&#x634;&#x627;&#x641; &#x644;&#x63A;&#x629; &#x631;&#x648;&#x628;&#x64A; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x628;&#x631;&#x646;&#x627;&#x645;&#x62C; &#x627;&#x644;&#x62A;&#x641;&#x627;&#x639;&#x644;&#x64A; IRB</title><link>https://academy.hsoub.com/programming/ruby/%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D8%A7%D9%81-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%A7%D9%84%D8%AA%D9%81%D8%A7%D8%B9%D9%84%D9%8A-irb-r2116/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_09/-------IRB.png.5cf99bfc90980a8a188035e05370865f.png" /></p>
<p>
	يوفر برنامج روبي التفاعلي Interactive Ruby -أو اختصارًا IRB طريقةً سريعةً لاستكشاف لغة برمجة روبي وتجربة الشيفرات البرمجية دون الحاجة لإنشاء ملفات جديدة وتنفيذها، إذ يُعد برنامج IRB حلقة قراءة-تقييم-طباعة Read-Eval-Print Loop -أو ما يعرف اختصارًا REPL- وهي أداة توفرها العديد من <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a> الحديثة لتوفير طريقة سهلة للعب واستكشاف لغة البرمجة، ولاستخدامها نُنفذ الأمر <code>irb</code> ثم نكتب مباشرةً كود روبي ليترجم IRB الشيفرة المدخلة ويقيّمها ويعرض النتيجة.
</p>

<p>
	يمكن ضمن IRB الوصول لجميع المزايا ضمن روبي إضافةً لأي مكتبات أو gems مثبتة على جهازك، ويمكنك أيضًا إعداد IRB لحفظ سجل الأوامر المدخلة خلال الجلسة، وحتى أنه يوفر ميزة الإكمال التلقائي للشيفرة أثناء إدخالها. سنتعرف في هذا المقال على طريقة استخدام IRB لتنفيذ بعض الشيفرات ومعاينة نتيجة تنفيذها واستدعاء المكتبات الخارجية وحتى تخصيص جلسة IRB.
</p>

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="315" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="560" data-embed-src="https://www.youtube.com/embed/8gjN-ZoATfo?si=zUyzQ-7ErlY4WdAb"></iframe>
</p>

<h2>
	تشغيل وإيقاف IRB
</h2>

<p>
	يكفي تثبيت <a href="https://academy.hsoub.com/programming/ruby/" rel="">لغة روبي</a> على الجهاز ليكون IRB مثبتًا وجاهزًا للاستخدام، ويمكننا تشغيله مباشرةً بتنفيذ الأمر <code>irb</code> من سطر الأوامر على النحو التالي:
</p>

<pre class="ipsCode">$ irb
</pre>

<p>
	ليظهر لنا نافذة IRB:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_14" style=""><span class="pln">irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">001</span><span class="pun">:</span><span class="lit">0</span><span class="pun">&gt;</span></pre>

<p>
	يدل السياق الافتراضي الأعلى في برنامج روبي على أننا ضمن برنامج IRB وأن أي شيفرات سننفذها ستُنفذ ضمن السياق <code>main</code>، كما أنه سيعرض رقم السطر الحالي، وفي حال تثبيت روبي باستخدام RVM، فقد يكون شكل النافذة مختلفًا قليلًا، إذ سيعرض رقم الإصدار الحالي للغة روبي بدلًا من ذلك:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_17" style=""><span class="lit">2.4</span><span class="pun">.</span><span class="lit">0</span><span class="pln"> </span><span class="pun">:</span><span class="lit">001</span><span class="pln"> </span><span class="pun">&gt;</span></pre>

<p>
	وللحصول على نفس نافذة الـ IRB ضمن الأمثلة في هذا المقال يمكن تشغيل IRB باستخدام الأمر التالي:
</p>

<pre class="ipsCode">irb --prompt inf-ruby
</pre>

<p>
	يمكن ضمن IRB إدخال التعليمات بصيغة <a href="https://wiki.hsoub.com/Ruby" rel="external">لغة برمجة روبي</a> مباشرةً لنختبر ذلك بإضافة عددين معًا:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_8" style=""><span class="pln">irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">001</span><span class="pun">:</span><span class="lit">0</span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span></pre>

<p>
	نضغط على مفتاح "Enter" ليعرض IRB نتيجة تنفيذ تلك التعليمة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_10" style=""><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">4</span></pre>

<p>
	يشير الرمز <code>&lt;=</code> في بداية السطر بأن هذه هي قيمة هي نتيجة تنفيذ عبارة روبي البرمجية السابقة، وللخروج من IRB ننفذ التعليمة <code>exit</code> أو نضغط على المفتاحين "CTRL+D" لنعود بذلك إلى واجهة <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">سطر الأوامر</a>. سنتعمق في الفقرة التالية في IRB وسنستخدمه لاستكشاف الشيفرات البرمجية.
</p>

<h2>
	تنفيذ الشيفرات البرمجية ضمن جلسة IRB
</h2>

<p>
	يُعد IRB وسيلةً رائعةً لتجربة الشيفرات البرمجية واختبارها سريعًا لمعرفة ما إذا كانت ستحل المشكلة المطلوبة، فمعظم الأوامر في روبي تعيد قيمةً ما عند تنفيذها وهو ما يظهر عند تنفيذ أي تعليمة في IRB، إذ سيطبع تلك القيمة على الشاشة. لنختبر ذلك بتنفيذ الأمر التالي ضمن جلسة IRB جديدة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_12" style=""><span class="pln">irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">001</span><span class="pun">:</span><span class="lit">0</span><span class="pun">&gt;</span><span class="pln"> puts </span><span class="str">"Hello World"</span></pre>

<p>
	عند الضغط على "Enter" سنرى نتيجتين من IRB:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_20" style=""><span class="typ">Hello</span><span class="pln"> </span><span class="typ">World</span><span class="pln">
</span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">nil</span></pre>

<p>
	السطر الأول هو ناتج عن تنفيذ التابع <code>puts</code>، الذي يطبع النص الممرر له وبعده محرف لسطر جديد إلى وحدة الخرج القياسي والذي هو الشاشة عادةً. يعيد التابع <code>puts</code> نفسه قيمةً عند تنفيذه وذلك لأن كل تابع في روبي يجب أن يعيد قيمةً ما، والقيمة التي يعيدها التابع <code>puts</code> هي <code>nil</code>، وهذا تمامًا ما يعرضه IRB في السطر الثاني، وفي كل مرة ننفذ فيها تعليمةً برمجيةً، سيتغير رقم السطر الحالي إلى رقم سطر جديد:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_22" style=""><span class="pln">irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">001</span><span class="pun">:</span><span class="lit">0</span><span class="pun">&gt;</span><span class="pln"> puts </span><span class="str">"Hello World"</span><span class="pln">
</span><span class="typ">Hello</span><span class="pln"> </span><span class="typ">World</span><span class="pln">
</span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">002</span><span class="pun">:</span><span class="lit">0</span><span class="pun">&gt;</span></pre>

<p>
	يفيد عرض رقم السطر الحالي خلال عملية تصحيح الأخطاء عند تنفيذ التعليمات المعقدة، فعند حدوث أخطاء، ستشير رسالة الخطأ إلى أرقام الأسطر التي نتج عنها الخطأ، ويمكن استخدام IRB لتعريف المتغيرات وإسناد القيم لها بنفس الصيغة المستخدمة ضمن برامج روبي، فمثلًا يمكننا تنفيذ الأمر التالي ضمن جلسة IRB والضغط على "Enter":
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_24" style=""><span class="pln">irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">002</span><span class="pun">:</span><span class="lit">0</span><span class="pun">&gt;</span><span class="pln"> birth_year </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1868</span></pre>

<p>
	لنرى القيمة التي تعيدها تلك التعليمة البرمجية:
</p>

<pre class="ipsCode">=&gt; 1868
</pre>

<p>
	يحتوي المتغير <code>birth_year</code> على تلك القيمة. بما أن معظم الأوامر في روبي تُرجع قيمًا، فسيعرض IRB لنا القيمة التي تعيدها تعليمة الإسناد هنا أيضًا.
</p>

<p>
	لنعرف متغيرًا آخرًا بالاسم <code>death_year</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_26" style=""><span class="pln">irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">003</span><span class="pun">:</span><span class="lit">0</span><span class="pun">&gt;</span><span class="pln"> death_year </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1921</span></pre>

<p>
	ثم نعرف المتغير <code>age_at_death</code> عن طريق طرح قيمة <code>birth_year</code> من قيمة المتغير <code>death_year</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_28" style=""><span class="pln">irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">004</span><span class="pun">:</span><span class="lit">0</span><span class="pun">&gt;</span><span class="pln"> age_at_death </span><span class="pun">=</span><span class="pln"> death_year </span><span class="pun">-</span><span class="pln"> birth_year</span></pre>

<p>
	يسند IRB القيمة للمتغير الجديد ويعرض النتيجة:
</p>

<pre class="ipsCode">=&gt; 53
</pre>

<p>
	نلاحظ عدم حاجتنا للاستعادة بالتوابع <code>puts</code> أو <code>print</code> ضمن جلسة IRB، إذ تُطبع تلقائيًا القيم التي تعيدها التعليمات البرمجية المُنفذة.
</p>

<p>
	يدعم IRB كتابة الشيفرات البرمجية التي تمتد على عدة أسطر، إذ يُنفذ تلك الشيفرات البرمجية بعد اكتمال صياغتها بصورةٍ صحيحة، ففي الشيفرة البرمجية التالية نستخدم مصفوفة من أسماء الأسماك ونستدعي منها التابع <a href="https://wiki.hsoub.com/Ruby/Array/select" rel="external"><code>select</code></a> لإرجاع أسماء الأسماك التي تحتوي على الحرف "a" في اسمها، ولكتابة هذه الشفرة على عدة أسطر ضمن جلسة IRB نضغط مفتاح "Enter" بعد كل سطر منها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_30" style=""><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pun">].</span><span class="pln">select </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">shark</span><span class="pun">|</span><span class="pln">
shark</span><span class="pun">.</span><span class="pln">include</span><span class="pun">?(</span><span class="str">"a"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	سينفذ IRB الشيفرة البرمجية فقط عند اكتمال صحة صياغتها، ونلاحظ ظهور رمز النجمة <code>*</code> في بداية الأسطر دلالةً على عدم تنفيذ IRB للشيفرات السابقة بعد، وتتغيير القيمة صفر في نهاية اسم السطر إلى واحد للدلالة على الدخول في سياق جديد مختلف:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_32" style=""><span class="pln">irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">005</span><span class="pun">:</span><span class="lit">0</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Angel"</span><span class="pun">].</span><span class="pln">select </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">shark</span><span class="pun">|</span><span class="pln">
irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">006</span><span class="pun">:</span><span class="lit">1</span><span class="pun">*</span><span class="pln"> shark</span><span class="pun">.</span><span class="pln">include</span><span class="pun">?(</span><span class="str">"a"</span><span class="pun">)</span><span class="pln">
irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">007</span><span class="pun">:</span><span class="lit">1</span><span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">end</span></pre>

<p>
	بما أن السطر الأول يحتوي على الكلمة المفتاحية <code>do</code>، فإن IRB لا ينفذ أي تعليمة لاحقة حتى يصل إلى الكلمة المفتاحية <code>end</code>، ومن ثم سيعرض النتيجة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_34" style=""><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Great White"</span><span class="pun">]</span></pre>

<p>
	يمكن باستخدام IRB اختبار الشيفرات البرمجية الصغيرة لاستكشاف طريقة عملها قبل اعتمادها ضمن البرامج التي نعمل على تطويرها، كما يمكن استخدام IRB لاستدعاء المكتبات الخارجية والتعامل معها وهو ما سنتعرف عليه في الفقرة التالية.
</p>

<h2>
	استخدام المكتبات والأمر Gem
</h2>

<p>
	يمكنك استيراد المكتبات إلى جلسة IRB باستخدام تعليمة <code>require</code> تمامًا كما نفعل في برنامج روبي، ويمكن أن تكون أحد المكتبات القياسية ضمن مكتبة روبي، أو مكتبات خاصة بنا، أو مكتبات Gems وهي مكتبات روبي المنشورة ضمن المستودع <a href="http://rubygems.org" rel="external nofollow">Rubygems.org</a>، والتي يمكننا تثبيتها باستخدام أمر <code>gem</code>؛ إذ تتضمن مكتبة روبي القياسية وحدات تمكننا من إرسال الطلبات عبر الويب مثلًا واستقبال نتائجها، ويمكن استخدام تلك المكتبة من داخل جلسة IRB تمامًا كما نفعل في برنامج روبي؛ إذ تُستخدم التعليمة <code>require</code> لاستيراد المكتبة <a href="http://ruby-doc.org/stdlib-2.4.2/libdoc/net/http/rdoc/Net/HTTP.html" rel="external nofollow">Net/HTTP</a> من مكتبة روبي القياسية بإدخال السطر التالي ضمن جلسة IRB والضغط على ENTER:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_36" style=""><span class="pln">require </span><span class="str">'net/http'</span></pre>

<p>
	يعيد تنفيذ هذا السطر في IRB القيمة <code>true</code>، مما يدل نجاح تحميل المكتبة، ويمكننا الآن استخدامها لكتابة الشيفرة التالية لإرسال طلب إلى موقع مثلًا <code>icanhazip.com</code> لمعرفة عنوان IP الخارجي الخاص بنا:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_38" style=""><span class="pln">uri </span><span class="pun">=</span><span class="pln"> URI</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="str">"http://icanhazip.com"</span><span class="pun">)</span><span class="pln">
response </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Net</span><span class="pun">::</span><span class="pln">HTTP</span><span class="pun">.</span><span class="pln">get_response uri
response</span><span class="pun">.</span><span class="pln">body</span></pre>

<p>
	بعد إدخال كل سطر من الأسطر السابقة سيعرض IRB القيمة التي تعيدها كل تعليمة منها، ونستفيد من ذلك لتصحيح الأخطاء في كل خطوة في حال حدوثها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_40" style=""><span class="pln">irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">010</span><span class="pun">:</span><span class="lit">0</span><span class="pun">&gt;</span><span class="pln"> uri </span><span class="pun">=</span><span class="pln"> URI</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="str">"http://icanhazip.com"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">=&gt;</span><span class="pln"> </span><span class="com">#&lt;URI::HTTP http://icanhazip.com&gt;</span><span class="pln">
irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">011</span><span class="pun">:</span><span class="lit">0</span><span class="pun">&gt;</span><span class="pln"> response </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Net</span><span class="pun">::</span><span class="pln">HTTP</span><span class="pun">.</span><span class="pln">get_response uri
</span><span class="pun">=&gt;</span><span class="pln"> </span><span class="com">#&lt;Net::HTTPOK 200 OK readbody=true&gt;</span><span class="pln">
irb</span><span class="pun">(</span><span class="pln">main</span><span class="pun">):</span><span class="lit">012</span><span class="pun">:</span><span class="lit">0</span><span class="pun">&gt;</span><span class="pln"> response</span><span class="pun">.</span><span class="pln">body
</span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">203.0</span><span class="pun">.</span><span class="lit">113.52</span><span class="pln">\n</span></pre>

<p>
	فمثلًا في حال لم يعثر على المكتبة المطلوبة، ستكون القيمة التي تعيدها التعليمة مختلفة. لنختبر ذلك باستيراد مكتبة <a href="https://rubygems.org/gems/httparty" rel="external nofollow">HTTParty</a>، والتي توفر طريقة أسهل للتعامل مع طلبات HTTP:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3570_42" style=""><span class="pln">require </span><span class="str">'httparty'</span></pre>

<p>
	نلاحظ ظهور هذه الرسالة:
</p>

<pre class="ipsCode">LoadError: cannot load such file -- httparty
</pre>

<p>
	والتي تخبرنا بأن المكتبة التي نريدها غير متاحة، إذ أن مكتبة HTTParty منشورةٌ على أنها مكتبة gem، لذلك نحتاج لتثبيتها قبل الاستخدام، لذا نخرج من جلسة IRB باستخدام المفتاحين "CTRL+D"، أو نكتب <code>exit</code> للعودة إلى سطر الأوامر، ثم ننفذ الأمر <code>gem</code> لتثبيت مكتبة <code>httparty</code>:
</p>

<pre class="ipsCode">$ gem install httparty
</pre>

<p>
	الآن، نعود لجلسة <code>irb</code> مرةً أخرى:
</p>

<pre class="ipsCode">$ irb
</pre>

<p>
	ونحاول تحميل وحدة المكتبة مرةً أخرى على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_45" style=""><span class="pln">require </span><span class="str">'httparty`</span></pre>

<p>
	نلاحظ أن قيمة تنفيذ تلك التعليمة هذه المرة هي <code>true</code>، مما يدل على نجاح تحميل المكتبة. لنستخدمها الآن كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_47" style=""><span class="pln">response </span><span class="pun">=</span><span class="pln"> </span><span class="typ">HTTParty</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="str">"http://icanhazip.com"</span><span class="pun">)</span><span class="pln">
response</span><span class="pun">.</span><span class="pln">body</span></pre>

<p>
	سنرى نتيجة قيمة رد الطلب المرسل على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_49" style=""><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">203.0</span><span class="pun">.</span><span class="lit">113.52</span><span class="pln">\n</span></pre>

<p>
	بعد أن تعرفنا على طريقة استدعاء واستخدام أي نوع من المكتبات ضمن IRB، لنتعرف على طريقة استخدامه لاستكشاف واختبار شيفرات روبي البرمجية في الفقرة التالية.
</p>

<h2>
	تحميل الشيفرات البرمجية ضمن IRB
</h2>

<p>
	يمكن استخدام الخيار <code>r-</code> عند إنشاء جلسة IRB جديدة لتحديد المكتبات أو Gems التي نريد تحميلها مباشرةً عند بدء جلسة IRB، فمثلًا يمكن تنفيذ الأمر <code>irb -r httparty</code>، الذي سيبدأ جلسة IRB جديدة مع تحميل مكتبة <code>httparty</code> مباشرةً، ما يعني عدم الحاجة لتنفيذ التعليمة <code>require httparty</code> ضمن الجلسة لاستيراد المكتبة، ويمكن استخدام هذا الخيار أيضًا لتحميل شيفرة برمجية خاصة بنا ضمن الجلسة الجديدة مما يفيد عند الحاجة لاستكشاف تلك الشيفرات أو اختبارها.
</p>

<p>
	ننهي جلسة IRB الحالية بكتابة <code>exit</code> أو بالضغط على المفتاحين "CTRL+D"، ثم ننشئ ملف روبي جديد بالاسم "ip_grabber.rb"، والذي سنعرف ضمنه كائنًا <code>IPGrabber</code> مع تابع <code>get</code> الذي يعيد عنوان IP الخارجي للجهاز. سنستعين بالمكتبة HTTParty لإرسال <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-http-%D8%B4%D8%B1%D8%AD-%D8%A7%D9%84%D8%AA%D8%AE%D8%A7%D8%B7%D8%A8-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%84-%D9%88%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%85-r74/" rel="">طلب HTTP</a> وجلب قيمة العنوان من الموقع icanhazip.com، إذ يمكننا استخدام الكائن <code>IPGrabber</code> ضمن برامجنا الأخرى لعزل الشيفرة الخاصة بالبرنامج عن أي تغييرات خارجية، وسنتمكن من استخدام هذا الكائن حتى بعد تبديل المكتبة التي يستخدمها لإرسال طلبات HTTP أو تغيير الموقع الذي يستخدمه لجلب عنوان IP دون الحاجة إلى تعديل أي شيفرة ضمن البرامج الأخرى.
</p>

<p>
	نبدأ بإضافة الشيفرة التالية إلى الملف لتعريف الصنف الجديد:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_51" style=""><span class="pln">require </span><span class="str">'httparty'</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">IPGrabber</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> initialize</span><span class="pun">()</span><span class="pln">
</span><span class="lit">@url</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"http://icanhazip.com"</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> get
response </span><span class="pun">=</span><span class="pln"> </span><span class="typ">HTTParty</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="lit">@url</span><span class="pun">)</span><span class="pln">
response</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">chomp </span><span class="com"># remove the \n if it exists</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	نحفظ الملف ونبدأ جلسة IRB ونحمل ذلك الملف ضمنها، وبما أنه ملف محلي وليس مكتبة خارجية أو مدمجة فيجب تحديد مسار هذا الملف عند تحميله ولا حاجة لكتابة اللاحقة <code>rb.</code> في نهاية اسم الملف:
</p>

<pre class="ipsCode">$ irb -r ./ip_grabber
</pre>

<p>
	يمكننا الآن -بعد انتهاء تحميل جلسة IRB الجديدة- استخدام هذا الكائن مباشرةً في الجلسة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_53" style=""><span class="pln">ip </span><span class="pun">=</span><span class="pln"> </span><span class="typ">IPGrabber</span><span class="pun">.</span><span class="pln">new
ip</span><span class="pun">.</span><span class="pln">get</span></pre>

<p>
	نلاحظ ظهور النتيجة وهي العنوان:
</p>

<pre class="ipsCode">=&gt; 203.0.113.52
</pre>

<p>
	تمكّننا خاصية تحميل الشيفرات الخاصة بنا ضمن جلسة IRB من فحصها أو استدعائها للعمل بها واختبارها قبل دمجها في البرامج التي نعمل على تطويرها. الآن، بعد أن تعرفنا على طريقة تحميل والعمل مع الشيفرات في جلسة IRB، سنتعرف على طريقة تخصيص جلسة IRB وإعدادها لتناسب حاجتنا.
</p>

<h2>
	تخصيص جلسة IRB
</h2>

<p>
	يمكننا عبر إنشاء ملف الإعدادات بالاسم "irbrc." تخصيص جلسة IRB، مثل إضافة ميزة دعم الإكمال التلقائي والمسافات وتحديد سجل تاريخ الأوامر. لنبدأ بإنشاء هذا الملف ضمن مجلد المستخدم:
</p>

<pre class="ipsCode">$ nano ~/.irbrc
</pre>

<p>
	نبدأ بتفعيل ميزة الإكمال التلقائي في IRB، إذ يتيح لنا ذلك ميزة استخدام المفتاح "TAB" ضمن الجلسة لإكمال أسماء الكائنات والمتغيرات وأسماء التوابع:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_55" style=""><span class="pln">require </span><span class="str">'irb/completion'</span></pre>

<p>
	نضيف بعدها تفعيل ميزة حفظ تاريخ الأوامر المدخلة في ملف خارجي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_57" style=""><span class="pln">IRB</span><span class="pun">.</span><span class="pln">conf</span><span class="pun">[:</span><span class="pln">SAVE_HISTORY</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000</span></pre>

<p>
	بذلك ستُسجل آخر 1000 عبارة برمجية ندخلها ضمن ملف بالاسم "irb_history." في مجلد المستخدم. إضافةً لذلك، عند فتح جلسة IRB جديدة، سيُحمل تاريخ هذه التعليمات تلقائيًا، ويمكننا استخدام مفاتيح الأسهم للأعلى أو الأسفل للتنقل بين هذه التعليمات، أو استخدام CTRL+R للبحث ضمنها تمامًا كما نفعل في <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r606/" rel="">صدفة باش bash</a>، ويمكننا أيضًا تحديد ملف لحفظ تاريخ التعليمات مختلف بإضافة السطر التالي لملف الإعدادات:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_59" style=""><span class="pln">IRB</span><span class="pun">.</span><span class="pln">conf</span><span class="pun">[:</span><span class="pln">HISTORY_FILE</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'~/your_history_filename'</span></pre>

<p>
	نضيف السطر التالي لملف الإعدادات لتفعيل ميزة إدراج المسافات تلقائيًا في بداية الأسطر، وهي ميزة مفيدة عند كتابة الأصناف والتوابع والكتل البرمجية blocks:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_61" style=""><span class="pln">IRB</span><span class="pun">.</span><span class="pln">conf</span><span class="pun">[:</span><span class="pln">AUTO_INDENT</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span></pre>

<p>
	يمكن لملف الإعدادات أن يحتوي شيفرات برمجية بلغة روبي، ما يعني إمكانية تعريف التوابع المساعدة أو استخدام <code>require</code> لتحميل المكتبات الإضافية، فمثلًا يمكننا تعريف التابع المساعد <code>history</code> إلى جلسة IRB لعرض التاريخ بإضافته على النحو ضمن ملف الإعدادات "irbrc.":
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_64" style=""><span class="kwd">def</span><span class="pln"> history
history_array </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Readline</span><span class="pun">::</span><span class="pln">HISTORY</span><span class="pun">.</span><span class="pln">to_a
print history_array</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="str">"\n"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	يمكننا بعد إنشاء جلسة IRB جديدة كتابة <code>history</code> لعرض تاريخ IRB، وقد يحتوي التاريخ على عدد كبير من السجلات لذا يمكننا التعديل على الأمر <code>history</code> ليأخذ عددًا اختياريًا يعبر عن عدد الأسطر التي نود عرضها، لذا نستبدل الشيفرة الخاصة به لتأخذ معاملًا اختياريًا يسمى <code>count</code> وتستخدمه لتحديد عدد السجلات التي يعرضها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3570_66" style=""><span class="com"># history command</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> history</span><span class="pun">(</span><span class="pln">count </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">

</span><span class="com"># Get history into an array</span><span class="pln">
history_array </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Readline</span><span class="pun">::</span><span class="pln">HISTORY</span><span class="pun">.</span><span class="pln">to_a

</span><span class="com"># if count is &gt; 0 we'll use it.</span><span class="pln">
</span><span class="com"># otherwise set it to 0</span><span class="pln">
count </span><span class="pun">=</span><span class="pln"> count </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> count </span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> count </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
from </span><span class="pun">=</span><span class="pln"> history_array</span><span class="pun">.</span><span class="pln">length </span><span class="pun">-</span><span class="pln"> count
history_array </span><span class="pun">=</span><span class="pln"> history_array</span><span class="pun">[</span><span class="pln">from</span><span class="pun">..-</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

print history_array</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="str">"\n"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	نحفظ الملف وننشئ جلسة IRB جديدة ثم نكتب <code>history 2</code> لنرى فقط آخر سطرين من سجل التاريخ الموجود. يجب التذكر أنه وبالرغم من إمكانية استخدام ملف الإعدادات "irbrc." لتحميل المكتبات التي نستخدمها بصورةٍ متكررة ضمن جلسات IRB إلا أن كل مكتبة منها ستزيد وقت تحميل كل جلسة جديدة، ولتجنب ذلك يُفضّل تحميل تلك المكتبات يدويًا باستخدام <code>require</code> عند الحاجة إليها ضمن كل جلسة على حدى.
</p>

<h2>
	الخاتمة
</h2>

<p>
	يوفر لنا IRB مكانًا لاستكشاف وتجربة شيفرات روبي البرمجية بسهولة، وهو وسيلة رائعة لاستخدامها لتطوير أجزاء من البرنامج الذي نعمل عليه قبل اعتماده وحفظه ضمن ملف. الآن، بعد أن تعرفنا على IRB، يمكنك استخدامه لاستكشاف أنواع البيانات المختلفة المتاحة في روبي أو استكشاف أي مزايا أخرى واستخدام وتجربة المكتبات والتعرف عليها.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-use-irb-to-explore-ruby" rel="external nofollow">How To Use IRB to Explore Ruby</a> لصاحبه Brian Hogan.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/ruby/%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%A8%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2115/" rel="">كتابة أول برنامج بلغة روبي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D9%83%D9%84-%D9%85%D8%A7-%D8%AA%D8%AD%D8%AA%D8%A7%D8%AC-%D8%A5%D9%84%D9%8A%D9%87-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%80-ruby-r16/" rel="">كل ما تحتاج إليه لتعلم البرمجة بـ Ruby</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-ruby-r529/" rel="">الدليل السريع إلى لغة البرمجة روبي Ruby</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2116</guid><pubDate>Wed, 20 Sep 2023 13:05:01 +0000</pubDate></item><item><title>&#x643;&#x62A;&#x627;&#x628;&#x629; &#x623;&#x648;&#x644; &#x628;&#x631;&#x646;&#x627;&#x645;&#x62C; &#x628;&#x644;&#x63A;&#x629; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%A8%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r2115/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_09/----.png.35d76b29bcbc56aeacdbc45f453aab9a.png" /></p>
<p>
	سنكتب معًا في هذا المقال أول برنامج بلغة روبي، وبدلًا من كتابة البرنامج التقليدي "Hello, World" سنكتب برنامجًا يطلب من المستخدم إدخال اسمه، ثم يستخدم هذا الاسم في طباعة جملة تحية. الخرج التالي هو مثال عن البرنامج الذي سنطوره في هذا المقال:
</p>

<pre class="ipsCode">Please enter your name.
Hassan
Hello, Hassan! I'm Ruby!
</pre>

<p>
	سنحتاج بدايةً لبيئة تطوير روبي مثبتة، ويمكنك الاطلاع على المقالات السابقة في سلسلة <a href="https://academy.hsoub.com/search/?tags=%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9%20%D8%A8%D9%84%D8%BA%D8%A9%20%D8%B1%D9%88%D8%A8%D9%8A&amp;updated_after=any&amp;sortby=newest" rel="">البرمجة بلغة روبي</a> للتعرف على طريقة إعداد بيئة تطوير روبي.
</p>

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="315" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="560" data-embed-src="https://www.youtube.com/embed/8gjN-ZoATfo?si=zUyzQ-7ErlY4WdAb"></iframe>
</p>

<h1>
	كتابة برنامج !Hello, World
</h1>

<p>
	سنكتب بدايًة البرنامج التقليدي "!Hello, World"، لذلك نفتح أي محرر نصوص عبر سطر الأوامر مثل نانو nano ونُنشئ ملفًا جديدًا على النحو التالي:
</p>

<pre class="ipsCode">$ nano hello.rb
</pre>

<p>
	بعد فتح الملف نكتب البرنامج التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5336_8" style=""><span class="pln">puts </span><span class="str">"Hello, World!"</span></pre>

<p>
	عند تنفيذ البرنامج سيطبع التابع <code>puts</code> المتاح في روبي سلسلة الحروف المُمررة له بين علامتي التنصيص على الشاشة، وتدعى هذه السلسلة من الحروف بالسلاسل النصية string. توفر لغة روبي عدة توابع جاهزة، مثل التابع <code>puts</code>، إذ يمكن استخدام تلك التوابع مباشرةً في البرنامج كما يمكننا تعريف توابع جديدة خاصة بنا. الآن، نحفظ التغييرات ونخرج من المحرر بالضغط على المفتاحين "Ctrl+X" ولتأكيد حفظ الملف نضغط على المفتاح "y" ثم "Enter". سنشغّل في الفقرة التالية البرنامج لتجربته ونرى النتيجة.
</p>

<h1>
	تشغيل برنامج روبي
</h1>

<p>
	بعد كتابتنا لبرنامج "!Hello, World" في الفقرة السابقة، ننفذ ذلك البرنامج باستخدام الأمر التالي:
</p>

<pre class="ipsCode">$ ruby hello.rb
</pre>

<p>
	سيظهر النص "!Hello, World" على الشاشة، إذ يقرأ مترجم <a href="https://academy.hsoub.com/programming/ruby/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-ruby-r636/" rel="">لغة روبي</a> بتنفيذ الأمر <code>ruby</code> الملف المحدد ويعاين محتواه ويترجمه، ثم يبدأ بتنفيذ الأمر <code>"!puts "Hello, World</code> باستدعاء الدالة <code>puts</code>، ويمرر لها النص "!Hello, World" مثل معامل لتلك الدالة، إذ تدعى القيم التي تمرر لأي دالة بالوسيط argument، ولاحظ أن علامات الاقتباس التي تحيط بالنص "!Hello, World" لا تطبع على الشاشة فهي تستخدم فقط لإخبار روبي بأن تلك القيمة هي سلسلة نصية بتحديد بداية ونهاية السلسلة بعلامات الاقتباس تلك. الآن، بعد نجاح تنفيذ البرنامج سنطوّره في الفقرة التالية ليصبح تفاعليًا.
</p>

<h1>
	طلب الدخل من المستخدم
</h1>

<p>
	كتبنا في الخطوة السابقة برنامجًا يطبع نصًا ثابتًا على الشاشة، دون أن يتفاعل البرنامج مع المستخدم، وسنطلب في هذه الفقرة من المستخدم أن يدخل قيمةً، وسنتعرف على طريقة استخدامها في البرنامج، ونبدأ بكتابة برنامج جديد بفتح محرر النصوص نانو وإنشاء ملف جديد كما فعلنا سابقًا:
</p>

<pre class="ipsCode">$ nano greeting.rb
</pre>

<p>
	نضيف السطر التالي لنطلب من المستخدم إدخال اسمه:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5336_10" style=""><span class="pln">puts </span><span class="str">"Please enter your name."</span></pre>

<p>
	استخدمنا التابع <code>puts</code> مرةً أخرى لطباعة نص السؤال على الشاشة، وسنضيف السطر التالي لاستقبال القيمة التي سيدخلها المستخدم:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5336_12" style=""><span class="pln">puts </span><span class="str">"Please enter your name."</span><span class="pln">
name </span><span class="pun">=</span><span class="pln"> gets</span></pre>

<p>
	يخبر التابع <code>gets</code> البرنامج بانتظار دخل المستخدم من لوحة المفاتيح، إذ سيتوقف عندها البرنامج عن العمل لحين انتهاء المستخدم من إدخال أي نص يريده، وسيتابع البرنامج عمله بعد ضغط المستخدم على مفتاح "Enter" من لوحة المفاتيح، لتُحوّل كل تلك الضغطات على لوحة المفاتيح بما فيها المفتاح "Enter" إلى سلسلة من المحارف. بما أننا سنستخدم سلسلة المحارف تلك ضمن خرج البرنامج، سنحفظها ضمن متغير جديد بالاسم <code>name</code> باستخدام معامل الإسناد <code>=</code> ليخزن بذلك روبي تلك السلسلة في ذاكرة الحاسوب لحين انتهاء تنفيذ البرنامج، والآن نضيف السطر التالي لطباعة النتيجة النهائية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5336_14" style=""><span class="pln">puts </span><span class="str">"Please enter your name."</span><span class="pln">
name </span><span class="pun">=</span><span class="pln"> gets
puts </span><span class="str">"Hi, #{name}! I'm Ruby!"</span></pre>

<p>
	نلاحظ استخدام التابع <code>puts</code> لطباعة سلسلة نصية مرةً أخرى، ولكن هذه المرة مررنا له سلسلةً نصيةً تحتوي على قيمة المتغير <code>name</code> ضمنها باستخدام ميزة في روبي لإدخال قيمة متغير ضمن سلسة نصية مباشرةً تدعى استيفاء السلسلة النصية string interpolation، إذ ستستبدل كلمة <code>{name}#</code> بالقيمة المحفوظة ضمن المتغير <code>name</code>، والتي يجب أن تكون اسم المستخدم الذي أدخله.
</p>

<p>
	الآن، نحفظ الملف ونخرج من محرر نانو بالضغط على مفتاحي "CTRL+X"، ثم تأكيد الحفظ بالضغط على "y" ثم مفتاح "Enter"، ولنشغل البرنامج ونختبره باستخدام الأمر التالي:
</p>

<pre class="ipsCode">$ ruby greeting.rb
</pre>

<p>
	سيطلب البرنامج من المستخدم إدخال اسمه بعد الإدخال نضغط "Enter" ونلاحظ النتيجة:
</p>

<pre class="ipsCode">Please enter your name.
Hassan
Hi, Hassan
! I'm Ruby!
</pre>

<p>
	بدلًا من طباعة <code>!Hi, Hassan! I'm Ruby</code>، طُبع فراغًا بعد الاسم المستخدم، والسبب في ذلك أن البرنامج استقبل جميع الضغطات على لوحة المفاتيح بما فيها المفتاح "Enter" في النهاية لإكمال الدخل، مما يؤدي أن <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-ruby-%E2%80%93-%D8%A7%D9%84%D8%AF%D9%85%D8%AC%D8%8C-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D9%8A%D9%81%D8%A7%D8%A1-%D9%88%D8%AD%D9%81%D8%B8%D9%87%D8%A7-%D9%81%D9%8A-%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-r537/" rel="">السلسلة النصية</a> ستنتهي بمحرف خاص يدل على طباعة سطر جديد، فالنتيجة التي يعرضها البرنامج هي فعلًا ما قد أُدخل من قبل المستخدم بما في ذلك محرف السطر الجديد. لحل تلك المشكلة نفتح ملف البرنامج "greeting.rb" ضمن محرر النصوص:
</p>

<pre class="ipsCode">$ nano greeting.rb
</pre>

<p>
	ونبحث عن السطر التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5336_17" style=""><span class="pln">name </span><span class="pun">=</span><span class="pln"> gets</span></pre>

<p>
	نعدله ليصبح:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5336_19" style=""><span class="pln">name </span><span class="pun">=</span><span class="pln"> gets</span><span class="pun">.</span><span class="pln">chop</span></pre>

<p>
	بالاستفادة من استدعاء التابع <code>chop</code> في روبي على السلسلة النصية المدخلة من قبل المستخدم باستخدام <code>gets</code>، سيُزال آخر محرف من السلسلة النصية وفي حالتنا هو محرف السطر الجديد الناتج عند الضغط على المفتاح "Enter". الآن، نحفظ الملف ونخرج من نانو بالضغط على CTRL+X ثم على المفتاح "y" لتأكيد حفظ الملف ونشغل البرنامج مرةً أخرى:
</p>

<pre class="ipsCode">$ ruby greeting.rb
</pre>

<p>
	نلاحظ هذه المرة بعد إدخال الاسم والضغط على "Enter" طباعة عبارة التحية على سطر واحد كما نريد:
</p>

<pre class="ipsCode">Please enter your name.
Sammy
Hi, Sammy! I'm Ruby!
</pre>

<p>
	وبذلك نكون قد طورنا برنامجًا بلغة روبي يقرأ دخلًا من المستخدم ويطبعه على الشاشة.
</p>

<h2>
	الخاتمة
</h2>

<p>
	تعرفنا في هذا المقال طريقة طلب الدخل من المستخدم في روبي ومعالجة ذلك الدخل لعرض النتيجة، ويمكن تطوير البرنامج أكثر، إذ يمكن مثلًا الطلب من المستخدم لونه المفضل وجعل البرنامج يطبع جملة "لونك المفضل هو الأحمر".
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-write-your-first-ruby-program" rel="external nofollow">How To Write Your First Ruby Program</a> لصاحبه Brian Hogan.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/ruby/rails/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A5%D8%B7%D8%A7%D8%B1-ruby-on-rails-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r2114/" rel="">تثبيت إطار Ruby on Rails في أوبنتو لينكس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-ruby-r529/" rel="">الدليل السريع إلى لغة البرمجة روبي Ruby</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-ruby-r636/" rel="">تعرّف على لغة البرمجة Ruby</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2115</guid><pubDate>Thu, 14 Sep 2023 13:00:00 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x631;&#x648;&#x628;&#x64A; &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x628;&#x64A;&#x626;&#x629; &#x628;&#x631;&#x645;&#x62C;&#x629; &#x645;&#x62D;&#x644;&#x64A;&#x629; &#x641;&#x64A; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/programming/ruby/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%B1%D9%88%D8%A8%D9%8A-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%85%D8%AD%D9%84%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r2113/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_09/-------.png.8b8d4cc9c0147f3dfc8cd5c2bce9aedb.png" /></p>
<p>
	يمكنك استخدام لغة البرمجة الديناميكية <a href="https://wiki.hsoub.com/Ruby/" rel="external">روبي Ruby</a> في عدة مجالات، مثل النصوص البرمجية وتطوير الألعاب وتطبيقات الويب، وعن تاريخ هذه اللغة فقد جرى إصدارها عام 1993 في اليابان واشتُهرت في عام 2005 على أنها لغة برمجة <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%85%D9%86-%D8%B7%D8%B1%D9%81-%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%85-r783/" rel="">تطبيقات الويب بطرف الخادم</a>، إذ صُممت روبي على أنها لغة سهلة الاستخدام خصوصًا للمبتدئين وقوية في نفس الوقت قادرة على إنشاء الأنظمة المعقدة، لذا فمهما كان مستواك البرمجي فتجربة هذه اللغة تستحق الاهتمام.
</p>

<p>
	سنتعرف في هذا المقال على إحدى أسهل طرق <a href="https://wiki.hsoub.com/Ruby/install" rel="external">تثبيت روبي</a> ضمن نظام التشغيل أوبنتو Ubuntu من لينكس باستخدام مدير إصدارات روبي Ruby Version Manager ويختصر إلى <a href="http://rvm.io/" rel="external nofollow">RVM</a>، الذي يساعدنا في تنزيل وتثبيت آخر نسخة من روبي مع المكتبات التي تحتاجها، إذ سنجهز بيئةً برمجيةً محلية على جهاز بنظام تشغيل لينكس باستخدام سطر الأوامر ونختبرها بكتابة برنامج روبي بسيط، ويمكنك تطبيق نفس الخطوات في هذا المقال ضمن أي توزيعة لينكس ديبيان Debian أخرى، كما يمكنك متابعة الخطوات وتنفيذها على نظام تشغيل أوبنتو 22.04 والتأكد من تنفيذ الأوامر وذلك من خلال حساب بصلاحيات مدير والتأكد من وجود اتصال بالإنترنت على الجهاز.
</p>

<h2>
	استخدام الطرفية
</h2>

<p>
	سنستخدم <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">سطر الأوامر command line</a> لتنفيذ الأوامر وتثبيت روبي، وهي واجهة نصية تمكنك من التعامل مع جهازك بكتابة أوامر نصية وظهور نتيجتها نصيًا أيضًا، وهي بديلٌ عن الواجهة المرئية التي نستخدم فيها مؤشر الفأرة للضغط على الأزرار والتطبيقات للتعامل مع الحاسوب. يُدعى سطر الأوامر أيضًا باسم <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r606/" rel="">الصدفة shell</a>، التي تتيح لنا أتمتة العديد من المهام اليومية على الحاسوب وهي من أهم الأدوات التي يجب على المبرمج إتقانها، وسنبدأ في الفقرة التالية باستخدامها لتثبيت مدير إصدارات روبي RVM والذي سيُثبت روبي وكل ما يلزمها.
</p>

<h2>
	تثبيت RVM وروبي
</h2>

<p>
	لنبدأ بتثبيت RVM والذي سيؤتمت عملية إعداد بيئة روبي ضمن <a href="https://academy.hsoub.com/apps/operating-systems/linux/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%B3%D8%B7%D8%AD-%D9%85%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-2004-r779/" rel="">نظام أوبنتو</a>، إذ أن أسهل وأسرع طريقة لتثبيته هي عبر تنفيذ النص البرمجي المتاح على <a href="https://rvm.io/rvm/install" rel="external nofollow">موقع RVM</a>، إذ يمكنك باستخدام الأمر <code>gpg</code> جلب المفتاح العام من خادم RVM والذي يُستخدم لتوقيه كل إصدار جديد من RVM، ما يتيح إمكانية التحقق من أن إصدار RVM الذي نحاول تنزيله هو إصدار أصلي وصحيح، ويمكنك ذلك بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">$ gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
</pre>

<p>
	وفي حال حدوث مشاكل بتنفيذ الأمر السابق يمكنك تجربة الأمر التالي:
</p>

<pre class="ipsCode">$ command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
$ command curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
</pre>

<p>
	يمكن باستخدام الأمر <code>curl</code> تنزيل النص البرمجي لتثبيت RVM، وسنبدأ أولًا بتثبيت ذلك الأمر في حال لم يكن مثبتًا:
</p>

<pre class="ipsCode">$ sudo apt-get install curl
</pre>

<p>
	عند تنفيذه، ستُسأل عن كلمة مرور حسابك قبل التثبيت، وستلاحظ عند كتابة كلمة المرور عدم ظهور المحارف التي تكتبها ضمن الطرفية وهي ميزة أمان لإخفاء كلمات المرور عندما تدخلها ضمن الطرفية، لذا يمكنك كتابة الكلمة بصورةٍ طبيعية حتى لو لم ترى المحارف التي تدخلها، ثم اضغط المفتاح Enter ليُثبت البرنامج.
</p>

<p>
	بعدها سنستخدم <code>curl</code> لتنزيل النص البرمجي لتثبيت RVM من موقع الخاص به من خلال الأمر التالي، ولاحظ محرف <code>\</code> في بداية الأمر وهو ضروري لتنفيذ الأمر الأصلي وليس أي تسميات لأوامر أخرى تطابقه:
</p>

<pre class="ipsCode">$ \curl -sSL https://get.rvm.io -o rvm.sh
</pre>

<p>
	الخيارات المُمررة للأمر السابق مهمة لذلك سنشرح كل منها على النحو التالي:
</p>

<ul>
	<li>
		الخيار <code>s-</code> اختصارًا للأمر <code>silent--</code>: يخبر الأمر <code>curl</code> ألا يظهر شريط تقدم عملية إرسال الطلب.
	</li>
	<li>
		الخيار <code>S-</code> اختصارًا للأمر <code>show-error--</code>: يخبر الأمر <code>curl</code> بإظهار رسائل خطأ فشل الطلب.
	</li>
	<li>
		الخيار <code>L-</code> اختصارًا للأمر <code>location--</code>: يخبر الأمر <code>curl</code> بمعالجة طلبات إعادة التوجيه التي قد يرسلها الخادم في حالات انتقال الملف المطلوب لعنوان آخر، إذ سيعيد إرسال نفس الطلب للعنوان الجديد.
	</li>
</ul>

<p>
	يمكنك معاينة محتوى النص البرمجي بعد انتهاء التنزيل بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">$ less rvm.sh
</pre>

<p>
	يمكنك استخدام الأسهم التنقل وتصفح محتوى ذلك الملف، وبعد الانتهاء يمكنك الضغط على <code>q</code> للخروج والرجوع إلى الطرفية، والآن يمكنك تنفيذه لتثبيت آخر إصدار مستقر من RVM على النحو التالي:
</p>

<pre class="ipsCode">$ cat rvm.sh | bash -s stable
</pre>

<p>
	سينتج عن تنفيذ هذا الأمر إنشاء مجلد جديد بالاسم "rvm." ضمن المجلد الأساس home للمستخدم الحالي، إذ ستُثبت ضمنه روبي وكل المكونات التي تحتاجها مع البرنامج التنفيذي <code>rvm</code> الذي سنستخدمه لتثبيت روبي، بحيث سيُضاف للملف "bashrc." المسار "rvm/bin." ضمن متغير البيئة <code>PATH</code> وذلك لنتمكن من تنفيذ الأمر <code>rvm</code> عبر سطر الأوامر بسهولة، ولتفعيل تلك التعديلات يجب تنفيذ الأمر التالي أولًا:
</p>

<pre class="ipsCode"> $ source ~/.rvm/scripts/rvm
</pre>

<p>
	والآن يمكننا تنفيذ الأمر <code>rvm</code> لتثبيت آخر نسخة من روبي على النحو التالي:
</p>

<pre class="ipsCode">$ rvm install ruby --default
</pre>

<p>
	لتُنزّل وتُثبت بذلك روبي ومكوناتها وتُعيّن تلك النسخة على أنها نسخة افتراضية ضمن النظام لاستخدامها لتجنب التعارض مع أي نسخة أخرى قد تكون مُثبتة مسبقًا على جهازك. قد تستغرق هذه العملية بعض الوقت، وفي حال واجهت مشاكل تأكد من تثبيت <a href="https://brew.sh/" rel="external nofollow">Homebrew</a> على جهازك بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
</pre>

<p>
	سيُثبت الأمر أي متطلبات ناقصة لديك وقد يسألك أيضًا عن كلمة المرور لحسابك، وسيظهر عن تنفيذ أمر تثبيت روبي خرجًا مشابهًا للتالي:
</p>

<pre class="ipsCode">Searching for binary rubies, this might take some time.
Found remote file https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.0.tar.bz2
Checking requirements for ubuntu.
Installing requirements for ubuntu.
Updating system....
Installing required packages: gawk, libssl-dev, zlib1g-dev, libyaml-dev, libsqlite3-dev, sqlite3, autoconf, libgmp-dev, libgdbm-dev, libncurses5-dev, automake, libtool, bison, libffi-dev, libgmp-dev, libreadline6-dev..................
Requirements installation successful.
</pre>

<p>
	وبعد الانتهاء من تثبيت المتطلبات سيبدأ RVM عملية تثبيت روبي ويظهر خرجًا مشابهًا للتالي:
</p>

<pre class="ipsCode">ruby-2.4.0 - #configure
ruby-2.4.0 - #download
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 16.4M 100 16.4M 0 0 4828k 0 0:00:03 0:00:03 --:--:-- 4829k
ruby-2.4.0 - #validate archive
ruby-2.4.0 - #extract
ruby-2.4.0 - #validate binary
ruby-2.4.0 - #setup
ruby-2.4.0 - #gemset created /home/brian/.rvm/gems/ruby-2.4.0@global
ruby-2.4.0 - #importing gemset /home/brian/.rvm/gemsets/global.gems..............................
ruby-2.4.0 - #generating global wrappers........
ruby-2.4.0 - #gemset created /home/brian/.rvm/gems/ruby-2.4.0
ruby-2.4.0 - #importing gemsetfile /home/brian/.rvm/gemsets/default.gems evaluated to empty gem list
ruby-2.4.0 - #generating default wrappers........
</pre>

<p>
	بذلك تكون قد ثُبتت آخر نسخة من روبي لديك مع بعض الأدوات الأخرى، مثل <code>irb</code> وهي طرفية روبي تفاعلية سنتعرف عليها في مقال لاحق من هذه السلسلة، والبرنامج <code>rake</code> لأتمتة تنفيذ النصوص البرمجية، والبرنامج <code>gem</code>، الذي سنستخدمه لتثبيت وتحديث مكتبات روبي بكل سهولة ضمن المشاريع.
</p>

<p>
	للتأكد من رقم النسخة المُثبتة من روبي، ننفذ الأمر التالي:
</p>

<pre class="ipsCode">$ ruby -v
</pre>

<p>
	سيظهر رقم نسخة روبي المثبتة لديك بخرج يشبه ما يلي:
</p>

<pre class="ipsCode">ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]
</pre>

<p>
	قبل تجربة روبي، يجب التأكد أن الطرفية عند فتحها تُنفذ صدفة تسجيل دخول، إذ أن RVM عدل الملف bash_profile. لتمكين استخدام نسخة روبي الذي ثبتها وذلك فقط ضمن صدفة تسجيل الدخول. سنختبر في الفقرة التالية روبي ببرنامج بسيط جدًا.
</p>

<h2>
	كتابة برنامج بسيط
</h2>

<p>
	كما هو معتاد عند تجربة لغة برمجة جديدة فأول برنامج نكتبه مهمته طباعة النص "Hello, World" لنتأكد بذلك من صحة تثبيت كل شيء وإمكانية تنفيذ البرامج بتلك اللغة، لذا نبدأ بإنشاء ملف جديد بالاسم hello.rb باستخدام محرر <a href="https://academy.hsoub.com/programming/workflow/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D8%B1-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A%D9%85-vim-%D9%88%D9%86%D8%A7%D9%86%D9%88-nano-r1590/" rel="">نانو nano</a>:
</p>

<pre class="ipsCode">$ nano hello.rb
</pre>

<p>
	ونكتب التعليمة التالية ضمن الملف:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3803_8" style=""><span class="pln">puts </span><span class="str">"Hello, World!"</span></pre>

<p>
	ثم نخرج من المحرر بالضغط على "Ctrl+X" ثم نضغط على المفتاح "Y" لتأكيد حفظ الملف، ثم ننفذ ملف البرنامج على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3803_10" style=""><span class="pln">$ ruby hello</span><span class="pun">.</span><span class="pln">rb</span></pre>

<p>
	ليظهر لنا الخرج المطلوب ضمن الطرفية:
</p>

<pre class="ipsCode">Hello, World!
</pre>

<p>
	بذلك تأكدنا أن بيئة برمجة روبي تعمل بنجاح ويمكننا استخدامها لتطوير البرامج والمشاريع باستخدام هذه اللغة.
</p>

<h2>
	الخاتمة
</h2>

<p>
	بعد أن تعرفنا على طريقة تجهيز بيئة للبرمجة بلغة روبي، سنتعرف في المقالات التالية أكثر على تلك اللغة عبر تجربة كتابة أول برنامج بلغة روبي، إذ أن أفضل طريقة لتعلم أي لغة برمجية هي بكتابة البرامج عمليًا وتنفيذها.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-ruby-and-set-up-a-local-programming-environment-on-ubuntu-22-04" rel="external nofollow">How To Install Ruby and Set Up a Local Programming Environment on Ubuntu 22.04</a> لصاحبته Milecia McGregor.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D9%83%D9%8A%D9%81-%D8%AA%D8%AB%D8%A8%D9%91%D8%AA-ruby-%D8%B9%D9%84%D9%89-%D9%88%D9%8A%D9%86%D8%AF%D9%88%D8%B2-10-r547/" rel="">كيف تثبّت Ruby على ويندوز 10</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-ruby-r529/" rel="">الدليل السريع إلى لغة البرمجة روبي Ruby</a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/Ruby" rel="external">توثيق لغة روبي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2113</guid><pubDate>Tue, 05 Sep 2023 13:00:00 +0000</pubDate></item><item><title>&#x62F;&#x644;&#x64A;&#x644; &#x62A;&#x646;&#x633;&#x64A;&#x642; &#x634;&#x64A;&#x641;&#x631;&#x627;&#x62A; &#x631;&#x648;&#x628;&#x64A; Ruby</title><link>https://academy.hsoub.com/programming/ruby/%D8%AF%D9%84%D9%8A%D9%84-%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-%D8%B1%D9%88%D8%A8%D9%8A-ruby-r886/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_05/Ruby-Style-Guide.jpg.8b31ee65093625c4a8de6c09f6b5b254.jpg" /></p>
<p>
	إن هذا الدليل مستوحى من دليل <a href="https://web.archive.org/web/20160410033955/https://github.com/styleguide/ruby" rel="external nofollow">GitHub</a> ودليل <a href="https://github.com/bbatsov/ruby-style-guide" rel="external nofollow">Bozhidar Batsov</a>.
</p>

<p>
	ولدينا أيضًا دليل <a href="https://academy.hsoub.com/programming/javascript/%D8%AF%D9%84%D9%8A%D9%84-airbnb-%D9%84%D9%86%D9%85%D8%B7-%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r632/" rel="">جافاسكربت</a> لتنسيق الشيفرة البرمجية
</p>

<h2>
	جدول المحتويات
</h2>

<ul>
	<li>
		<a href="#%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D9%81%D8%A7%D8%AA_%D8%A7%D9%84%D8%A8%D9%8A%D8%B6%D8%A7%D8%A1" rel="">المسافات البيضاء</a>

		<ul>
			<li>
				<a href="#%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D9%81%D8%A9_%D8%A7%D9%84%D8%A8%D8%A7%D8%AF%D8%A6%D8%A9_%D9%81%D9%8A_%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A9" rel="">المسافة البادئة في الشيفرة</a>
			</li>
			<li>
				<a href="#%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D9%81%D8%A7%D8%AA_%D8%A7%D9%84%D8%B3%D8%B7%D8%B1%D9%8A%D8%A9" rel="">المسافات السطرية</a>
			</li>
		</ul>
	</li>
	<li>
		<a href="#%D8%A7%D9%84%D8%A3%D8%B3%D8%B7%D8%B1_%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF" rel="">الأسطر الجديدة</a>
		<ul>
			<li>
				<a href="%D8%B7%D9%88%D9%84_%D8%A7%D9%84%D8%B3%D8%B7%D8%B1" rel="">طول السطر</a>
			</li>
		</ul>
	</li>
	<li>
		<a href="#%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%8A%D9%82%D8%A7%D8%AA" rel="">التعليقات</a>
		<ul>
			<li>
				<a href="#%D8%AA%D8%B9%D9%84%D9%8A%D9%82%D8%A7%D8%AA_%D8%B9%D9%84%D9%89_%D9%85%D8%B3%D8%AA%D9%88%D9%89_%D8%A7%D9%84%D9%85%D9%84%D9%81" rel="">تعليقات على مستوى الملف/الصنف</a>
			</li>
			<li>
				<a href="#%D8%AA%D8%B9%D9%84%D9%8A%D9%82%D8%A7%D8%AA_%D8%A7%D9%84%D8%AF%D8%A7%D9%84%D8%A9" rel="">تعليقات الدالة</a>
			</li>
			<li>
				<a href="#%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%8A%D9%82%D8%A7%D8%AA_%D8%A7%D9%84%D9%83%D8%AA%D9%84%D9%8A%D8%A9_%D9%88%D8%A7%D9%84%D9%85%D8%B6%D9%85%D9%86%D8%A9" rel="">التعليقات الكتلية والمضمّنة</a>
			</li>
			<li>
				<a href="#%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA_%D8%A7%D9%84%D8%AA%D8%B1%D9%82%D9%8A%D9%85_%D9%88%D8%A7%D9%84%D8%A5%D9%85%D9%84%D8%A7%D8%A1_%D9%88%D8%A7%D9%84%D9%86%D8%AD%D9%88" rel="">علامات الترقيم والإملاء والنحو</a>
			</li>
			<li>
				<a href="#%D8%AA%D8%B9%D9%84%D9%8A%D9%82%D8%A7%D8%AA_TODO" rel="">تعليقات TODO</a>
			</li>
			<li>
				<a href="#%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA_%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9_%D8%A8%D8%AF%D9%88%D9%86_%D8%AA%D8%B9%D9%84%D9%8A%D9%82%D8%A7%D8%AA" rel="">شيفرات برمجية بدون تعليقات</a>
			</li>
		</ul>
	</li>
	<li>
		<a href="#%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84" rel="">الدوال</a>
		<ul>
			<li>
				<a href="#%D8%AA%D8%B9%D8%B1%D9%8A%D9%81_%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84" rel="">تعريف الدوال</a>
			</li>
			<li>
				<a href="#%D8%AF%D9%88%D8%A7%D9%84_%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%AF%D8%B9%D8%A7%D8%A1" rel="">دوال الاستدعاء</a>
			</li>
		</ul>
	</li>
	<li>
		<a href="#%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D8%A8%D9%8A%D8%B1_%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9" rel="">التعابير الشرطيّة</a>
		<ul>
			<li>
				<a href="#%D8%A7%D9%84%D9%83%D9%84%D9%85%D8%A7%D8%AA_%D8%A7%D9%84%D9%85%D9%81%D8%AA%D8%A7%D8%AD%D9%8A%D8%A9_%D9%84%D9%84%D8%AC%D9%85%D9%84_%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9" rel="">الكلمات المفتاحية للجمل الشرطية</a>
			</li>
			<li>
				<a href="#%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84_%D8%A7%D9%84%D8%AB%D9%84%D8%A7%D8%AB%D9%8A" rel="">المعامل الثلاثي</a>
			</li>
			<li>
				<a href="#%D8%A7%D9%84%D8%B4%D8%B1%D9%88%D8%B7_%D8%A7%D9%84%D9%85%D8%AA%D8%B4%D8%B9%D8%A8%D8%A9" rel="">الشروط المتشعّبة</a>
			</li>
			<li>
				<a href="#%D8%A7%D9%84%D8%B5%D9%8A%D8%A7%D8%BA%D8%A9" rel="">الصياغة</a>
			</li>
		</ul>
	</li>
	<li>
		<a href="#%D9%82%D9%88%D8%A7%D8%B9%D8%AF_%D8%A7%D9%84%D8%AA%D8%B3%D9%85%D9%8A%D8%A9" rel="">قواعد التسمية</a>
	</li>
	<li>
		<a href="#%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81" rel="">الأصناف</a>
	</li>
	<li>
		<a href="#%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%AB%D9%86%D8%A7%D8%A1%D8%A7%D8%AA" rel="">الاستثناءات</a>
	</li>
	<li>
		<a href="#%D8%A7%D9%84%D8%AA%D8%AC%D9%85%D9%8A%D8%B9%D8%A7%D8%AA" rel="">التجميعات</a>
	</li>
	<li>
		<a href="#%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" rel="">السلاسل النصية</a>
	</li>
	<li>
		<a href="#%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D8%A8%D9%8A%D8%B1_%D8%A7%D9%84%D9%86%D9%85%D8%B7%D9%8A%D8%A9" rel="">التعابير النمطية</a>
	</li>
	<li>
		<a href="#%D9%85%D8%AD%D8%A7%D8%B1%D9%81_%D8%A7%D9%84%D9%86%D8%B3%D8%A8%D8%A9_%D8%A7%D9%84%D9%85%D8%A6%D9%88%D9%8A%D8%A9" rel="">محارف النسبة المئوية</a>
	</li>
	<li>
		<a href="#%D8%B1%D9%8A%D9%84%D8%B2" rel="">ريلز</a>
		<ul>
			<li>
				<a href="#%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA" rel="">نطاقات</a>
			</li>
		</ul>
	</li>
	<li>
		<a href="#%D8%A7%D9%86%D8%B3%D8%AC%D9%85_%D9%85%D8%B9_%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A9" rel="">انسجم مع الشيفرة</a>
	</li>
</ul>

<h2 id="المسافات_البيضاء">
	المسافات البيضاء
</h2>

<h3 id="المسافة_البادئة_في_الشيفرة">
	المسافة البادئة في الشيفرة
</h3>

<ul>
	<li>
		<p>
			استخدم الزر (<code>tabs</code>) بمقدار مسافتين (وتسمى أيضًا Soft-Tab نظرًا لأن زر Tab الإفتراضي يكون ثمان مسافات).
		</p>
	</li>
	<li>
		<p>
			سيكون عمق الكلمة المفتاحية <code>when</code> بقدر عمق <code>case</code>.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_7" style=""><span class="kwd">case</span><span class="pln">
</span><span class="kwd">when</span><span class="pln"> song</span><span class="pun">.</span><span class="pln">name </span><span class="pun">==</span><span class="pln"> </span><span class="str">'Misty'</span><span class="pln">
  puts </span><span class="str">'Not again!'</span><span class="pln">
</span><span class="kwd">when</span><span class="pln"> song</span><span class="pun">.</span><span class="pln">duration </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">120</span><span class="pln">
  puts </span><span class="str">'Too long!'</span><span class="pln">
</span><span class="kwd">when</span><span class="pln"> </span><span class="typ">Time</span><span class="pun">.</span><span class="pln">now</span><span class="pun">.</span><span class="pln">hour </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">21</span><span class="pln">
  puts </span><span class="str">"It's too late"</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
  song</span><span class="pun">.</span><span class="pln">play
</span><span class="kwd">end</span><span class="pln">

kind </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">case</span><span class="pln"> year
       </span><span class="kwd">when</span><span class="pln"> </span><span class="lit">1850.</span><span class="pun">.</span><span class="lit">1889</span><span class="pln"> </span><span class="kwd">then</span><span class="pln"> </span><span class="str">'Blues'</span><span class="pln">
       </span><span class="kwd">when</span><span class="pln"> </span><span class="lit">1890.</span><span class="pun">.</span><span class="lit">1909</span><span class="pln"> </span><span class="kwd">then</span><span class="pln"> </span><span class="str">'Ragtime'</span><span class="pln">
       </span><span class="kwd">when</span><span class="pln"> </span><span class="lit">1910.</span><span class="pun">.</span><span class="lit">1929</span><span class="pln"> </span><span class="kwd">then</span><span class="pln"> </span><span class="str">'New Orleans Jazz'</span><span class="pln">
       </span><span class="kwd">when</span><span class="pln"> </span><span class="lit">1930.</span><span class="pun">.</span><span class="lit">1939</span><span class="pln"> </span><span class="kwd">then</span><span class="pln"> </span><span class="str">'Swing'</span><span class="pln">
       </span><span class="kwd">when</span><span class="pln"> </span><span class="lit">1940.</span><span class="pun">.</span><span class="lit">1950</span><span class="pln"> </span><span class="kwd">then</span><span class="pln"> </span><span class="str">'Bebop'</span><span class="pln">
       </span><span class="kwd">else</span><span class="pln"> </span><span class="str">'Jazz'</span><span class="pln">
       </span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			حاذِ وسطاء الّدالة فإما أن يكونوا على نفس السطر أو سطر لكلّ واحدٍ منهم.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_9" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">create_translation</span><span class="pun">(</span><span class="pln">phrase_id</span><span class="pun">,</span><span class="pln"> phrase_key</span><span class="pun">,</span><span class="pln"> target_locale</span><span class="pun">,</span><span class="pln">
                            value</span><span class="pun">,</span><span class="pln"> user_id</span><span class="pun">,</span><span class="pln"> do_xss_check</span><span class="pun">,</span><span class="pln"> allow_verification</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">create_translation</span><span class="pun">(</span><span class="pln">phrase_id</span><span class="pun">,</span><span class="pln">
                            phrase_key</span><span class="pun">,</span><span class="pln">
                            target_locale</span><span class="pun">,</span><span class="pln">
                            value</span><span class="pun">,</span><span class="pln">
                            user_id</span><span class="pun">,</span><span class="pln">
                            do_xss_check</span><span class="pun">,</span><span class="pln">
                            allow_verification</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">create_translation</span><span class="pun">(</span><span class="pln">
  phrase_id</span><span class="pun">,</span><span class="pln">
  phrase_key</span><span class="pun">,</span><span class="pln">
  target_locale</span><span class="pun">,</span><span class="pln">
  value</span><span class="pun">,</span><span class="pln">
  user_id</span><span class="pun">,</span><span class="pln">
  do_xss_check</span><span class="pun">,</span><span class="pln">
  allow_verification
</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			حاذِ الأسطر المتتابعة بمقدار مسافتين في جملة التنفيذ للتعابير المنطقية متعددة الأسطر.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_11" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> is_eligible</span><span class="pun">?(</span><span class="pln">user</span><span class="pun">)</span><span class="pln">
  </span><span class="typ">Trebuchet</span><span class="pun">.</span><span class="pln">current</span><span class="pun">.</span><span class="pln">launch</span><span class="pun">?(</span><span class="typ">ProgramEligibilityHelper</span><span class="pun">::</span><span class="pln">PROGRAM_TREBUCHET_FLAG</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
  is_in_program</span><span class="pun">?(</span><span class="pln">user</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
  program_not_expired
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> is_eligible</span><span class="pun">?(</span><span class="pln">user</span><span class="pun">)</span><span class="pln">
  </span><span class="typ">Trebuchet</span><span class="pun">.</span><span class="pln">current</span><span class="pun">.</span><span class="pln">launch</span><span class="pun">?(</span><span class="typ">ProgramEligibilityHelper</span><span class="pun">::</span><span class="pln">PROGRAM_TREBUCHET_FLAG</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
    is_in_program</span><span class="pun">?(</span><span class="pln">user</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
    program_not_expired
</span><span class="kwd">end</span></pre>

<h2 id="المسافات_السطرية">
	المسافات السطرية
</h2>

<ul>
	<li>
		<p>
			لا تترك مسافة زائدة.
		</p>
	</li>
	<li>
		<p>
			عند تضمين التعليقات في السطر، اترك مسافة واحدة بين نهاية الشيفرة البرمجية وبداية تعليقك.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_13" style=""><span class="com"># bad</span><span class="pln">
result </span><span class="pun">=</span><span class="pln"> func</span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">)#</span><span class="pln"> we might want to change b to c

</span><span class="com"># good</span><span class="pln">
result </span><span class="pun">=</span><span class="pln"> func</span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">)</span><span class="pln"> </span><span class="com"># we might want to change b to c</span></pre>

<ul>
	<li>
		<p>
			استخدم المسافات حول المعاملات (operators)، وبعد الفواصل، وبعد النقطتين، وبعد الفاصلة المنقوطة، وبعد فتح قوس ما <code>{</code> وقبل إغلاقه أيضًا <code>}</code>.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7318_6" style=""><span class="pln">sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
a</span><span class="pun">,</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
</span><span class="lit">1</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="kwd">true</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> puts </span><span class="str">'Hi'</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">each </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">e</span><span class="pun">|</span><span class="pln"> puts e </span><span class="pun">}</span></pre>

<ul>
	<li>
		<p>
			لا تضع أبدًا مسافة فارغة قبل الفاصلة. <code> </code>
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7318_8" style=""><span class="pln">result </span><span class="pun">=</span><span class="pln"> func</span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">)</span></pre>

<ul>
	<li>
		<p>
			لا تضع مسافة داخل كتلة وسطاء الأنبوب (pipe)، بل ضع واحدًا بين الوسطاء في الكتلة، وواحدًا آخر خارج كتلة وسطاء الأنبوب.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_15" style=""><span class="com"># bad</span><span class="pln">
</span><span class="pun">{}.</span><span class="pln">each </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> x</span><span class="pun">,</span><span class="pln">  y </span><span class="pun">|</span><span class="pln">puts x </span><span class="pun">}</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="pun">{}.</span><span class="pln">each </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">|</span><span class="pln"> puts x </span><span class="pun">}</span></pre>

<ul>
	<li>
		<p>
			لا تضع مسافات بين إشارة التعجب <code>!</code> ومعاملاتها.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7318_11" style=""><span class="pun">!</span><span class="pln">something</span></pre>

<ul>
	<li>
		<p>
			لا تترك فارغات بعد الأقواس من نوع <code>(</code> و<code>[</code> أو قبلها <code>)</code> و<code>]</code>.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_7318_13" style=""><span class="pln">some</span><span class="pun">(</span><span class="pln">arg</span><span class="pun">).</span><span class="pln">other
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">length</span></pre>

<ul>
	<li>
		<p>
			تجنب وضع المسافات عند إنشاء السلاسل النصية.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_17" style=""><span class="com"># bad</span><span class="pln">
var </span><span class="pun">=</span><span class="pln"> </span><span class="str">"This #{ foobar } is interpolated."</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
var </span><span class="pun">=</span><span class="pln"> </span><span class="str">"This #{foobar} is interpolated."</span></pre>

<ul>
	<li>
		<p>
			لا تستخدم مسافة إضافية في النطاق الحرفي (range literals).
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_19" style=""><span class="com"># bad</span><span class="pln">
</span><span class="pun">(</span><span class="lit">0</span><span class="pln"> </span><span class="pun">...</span><span class="pln"> coll</span><span class="pun">).</span><span class="pln">each </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">item</span><span class="pun">|</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="pun">(</span><span class="lit">0.</span><span class="pun">..</span><span class="pln">coll</span><span class="pun">).</span><span class="pln">each </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">item</span><span class="pun">|</span></pre>

<h3 id="الأسطر_الجديد">
	الأسطر الجديدة
</h3>

<ul>
	<li>
		<p>
			أضف سطرًا جديدًا بعد الجملة الشرطية <code>if</code> ذات الشروط المتعددة لتصبح في عدة أسطر، ولتساعد في التفريق بين الشروط وجسم الشرط.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_21" style=""><span class="kwd">if</span><span class="pln"> </span><span class="lit">@reservation_alteration</span><span class="pun">.</span><span class="pln">checkin </span><span class="pun">==</span><span class="pln"> </span><span class="lit">@reservation</span><span class="pun">.</span><span class="pln">start_date </span><span class="pun">&amp;&amp;</span><span class="pln">
   </span><span class="lit">@reservation_alteration</span><span class="pun">.</span><span class="pln">checkout </span><span class="pun">==</span><span class="pln"> </span><span class="pun">(</span><span class="lit">@reservation</span><span class="pun">.</span><span class="pln">start_date </span><span class="pun">+</span><span class="pln"> </span><span class="lit">@reservation</span><span class="pun">.</span><span class="pln">nights</span><span class="pun">)</span><span class="pln">

  redirect_to_alteration </span><span class="lit">@reservation_alteration</span><span class="pln">
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			أضف سطرًا جديدًا بعد نهاية الجمل الشرطية، والكتل، والبيانات …إلخ.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_25" style=""><span class="kwd">if</span><span class="pln"> robot</span><span class="pun">.</span><span class="pln">is_awesome</span><span class="pun">?</span><span class="pln">
  send_robot_present
</span><span class="kwd">end</span><span class="pln">

robot</span><span class="pun">.</span><span class="pln">add_trait</span><span class="pun">(:</span><span class="pln">human_like_intelligence</span><span class="pun">)</span></pre>

<ul>
	<li>
		<p>
			لا تضف أسطرًا جديدةً فارغةً بين المناطق ذات مسافات بادئة مختلفة (مثلًا حول أجزاء الصنف أو أجسام الوحدة).
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_28" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln">

  </span><span class="kwd">def</span><span class="pln"> bar
    </span><span class="com"># body omitted</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">

</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln">
  </span><span class="kwd">def</span><span class="pln"> bar
    </span><span class="com"># body omitted</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			أضف سطرًا جديدًا فارغًا بين الدوالّ.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_30" style=""><span class="kwd">def</span><span class="pln"> a
</span><span class="kwd">end</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> b
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			أضف سطرًا فارغًا لفصل البيانات المترابطة في الدوالّ لتشكيلّ فقرات منطقية داخلها.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_32" style=""><span class="kwd">def</span><span class="pln"> transformorize_car
  car </span><span class="pun">=</span><span class="pln"> manufacture</span><span class="pun">(</span><span class="pln">options</span><span class="pun">)</span><span class="pln">
  t </span><span class="pun">=</span><span class="pln"> transformer</span><span class="pun">(</span><span class="pln">robot</span><span class="pun">,</span><span class="pln"> disguise</span><span class="pun">)</span><span class="pln">

  car</span><span class="pun">.</span><span class="pln">after_market_mod</span><span class="pun">!</span><span class="pln">
  t</span><span class="pun">.</span><span class="pln">transform</span><span class="pun">(</span><span class="pln">car</span><span class="pun">)</span><span class="pln">
  car</span><span class="pun">.</span><span class="pln">assign_cool_name</span><span class="pun">!</span><span class="pln">

  fleet</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">car</span><span class="pun">)</span><span class="pln">
  car
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			أضف سطرًا فارغًا في نهاية كل ملف، ولا تضف أبدًا عدة أسطر.
		</p>
	</li>
</ul>

<h2 id="طول_السطر">
	طول السطر
</h2>

<ul>
	<li>
		حافظ على كلّ سطر من الشيفرة البرمجية ليكون بطول مناسب للقراءة، وابقِ طول الأسطر أقل من 100 محرف (<a href="https://github.com/airbnb/ruby/blob/master/rationales.md#line-length" rel="external nofollow">إليك السبب</a>) إلا إن كان لديك سبب وجيه لجعله أطول من ذلك.
	</li>
</ul>

<h2 id="التعليقات">
	التعليقات
</h2>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		على الرغم من أن التعليقات متعبة عند كتابتها، إلا أنها مفيدة للغاية للحفاظ على مقروئية شيفرتك البرمجية، ستصف القواعد التالية ما يجب التعليق عليه، وأين تضع هذا التعليق، لكن تذكر: على الرغم من أن التعليقات مهمة جدًا إلا أنه من الأفضل دومًا أن تكون الشيفرة البرمجية هي من تشرح نفسها بنفسها، فإعطاؤك أسماءً منطقية للأنواع والمتغيرات أفضل بكثير من استخدام أسماء غامضة تستوجب عليك شرحها من خلال التعليقات.<br>
		عند كتابتك للتعليقات، اكتبها لجمهورك وللمساهم القادم الّذي سيحتاج لفهم شيفرتك البرمجية، وكن سخيًا، فيمكن أن يكون المساهم القادم أنت!
	</p>

	<p>
		- <a href="https://google.github.io/styleguide/cppguide.html" rel="external nofollow">دليل</a> Google لتنسيق الشيفرة البرمجية للغة C++‎
	</p>
</blockquote>

<p>
	كُتِبَ هذا الشرح باستعانة كبيرة من دليل Google لتنسيق الشيفرة البرمجية للغة <a href="https://google.github.io/styleguide/cppguide.html#Comments" rel="external nofollow">C++</a>‎ ولغة <a href="https://google.github.io/styleguide/pyguide.html#Comments" rel="external nofollow">Python</a>.
</p>

<h3 id="تعليقات_على_مستوى_الملف">
	تعليقات على مستوى الملف/الصنف
</h3>

<p>
	عند التعريف عن صنف ما يجب أن يوجد تعليق مصاحب له يصف ماهيّة الصنف وكيفية استخدامه.
</p>

<p>
	يجب أن يملك الملف الذي لا يحتوي على أصناف، أو يحتوي على أكثر من صنف على تعليق في أعلاه يصف محتوياته.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_34" style=""><span class="com"># Automatic conversion of one locale to another where it is possible, like</span><span class="pln">
</span><span class="com"># American to British English.</span><span class="pln">
</span><span class="kwd">module</span><span class="pln"> </span><span class="typ">Translation</span><span class="pln">
  </span><span class="com"># Class for converting between text between similar locales.</span><span class="pln">
  </span><span class="com"># Right now only conversion between American English -&gt; British, Canadian,</span><span class="pln">
  </span><span class="com"># Australian, New Zealand variations is provided.</span><span class="pln">
  </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">PrimAndProper</span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> initialize
      </span><span class="lit">@converters</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">:</span><span class="pln">en </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">:</span><span class="str">"en-AU"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">AmericanToAustralian</span><span class="pun">.</span><span class="pln">new</span><span class="pun">,</span><span class="pln">
                               </span><span class="pun">:</span><span class="str">"en-CA"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">AmericanToCanadian</span><span class="pun">.</span><span class="pln">new</span><span class="pun">,</span><span class="pln">
                               </span><span class="pun">:</span><span class="str">"en-GB"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">AmericanToBritish</span><span class="pun">.</span><span class="pln">new</span><span class="pun">,</span><span class="pln">
                               </span><span class="pun">:</span><span class="str">"en-NZ"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">AmericanToKiwi</span><span class="pun">.</span><span class="pln">new</span><span class="pun">,</span><span class="pln">
                             </span><span class="pun">}</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">

  </span><span class="pun">...</span><span class="pln">

  </span><span class="com"># Applies transforms to American English that are common to</span><span class="pln">
  </span><span class="com"># variants of all other English colonies.</span><span class="pln">
  </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">AmericanToColonial</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">

  </span><span class="com"># Converts American to British English.</span><span class="pln">
  </span><span class="com"># In addition to general Colonial English variations, changes "apartment"</span><span class="pln">
  </span><span class="com"># to "flat".</span><span class="pln">
  </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">AmericanToBritish</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="typ">AmericanToColonial</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span></pre>

<p>
	يجب أن تملك جميع الملفات من بينهم ملفات البيانات والإعداد، على تعليقات على مستوى الملف.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_36" style=""><span class="com"># List of American-to-British spelling variants.</span><span class="pln">
</span><span class="com">#</span><span class="pln">
</span><span class="com"># This list is made with</span><span class="pln">
</span><span class="com"># lib/tasks/list_american_to_british_spelling_variants.rake.</span><span class="pln">
</span><span class="com">#</span><span class="pln">
</span><span class="com"># It contains words with general spelling variation patterns:</span><span class="pln">
</span><span class="com">#   [trave]led/lled, [real]ize/ise, [flav]or/our, [cent]er/re, plus</span><span class="pln">
</span><span class="com"># and these extras:</span><span class="pln">
</span><span class="com">#   learned/learnt, practices/practises, airplane/aeroplane, ...</span><span class="pln">

sectarianizes</span><span class="pun">:</span><span class="pln"> sectarianises
neutralization</span><span class="pun">:</span><span class="pln"> neutralisation
</span><span class="pun">...</span></pre>

<h3 id="تعليقات_الدالة">
	تعليقات الدالة
</h3>

<p>
	يجب أن يكون هنالك تعليقات عند تعريف كلّ دالة وتكون قبلها مباشرة لتصف ما تؤديه هذه الدالة وكيفية استخدامها، ويجب أن تكون هذه الملفات وصفية ("يُفتح الملف") بدلًا من أمرية ("افتح الملف"). التعليقات التي تصف الدالّة، لا تشرح ما تقوم به الدالّة خطوة بخطوة. عمومًا، لا تصف هذه التعليقات كيفية تنفيذ هذه الدالّة عملها حرفيًا، وإنما، يجب ترك هذه التعليقات لتتخلل الشيفرة البرمجية للدالّة.
</p>

<p>
	يجب أن تذكر كلُّ دالّة ما هي مدخلاتها ومخرجاتها، إلا إن كانت لا تستوف جميع المعايير التالية:
</p>

<ul>
	<li>
		غير مرئية من الخارج.
	</li>
	<li>
		قصيرة جدًا.
	</li>
	<li>
		واضحة وبديهية.
	</li>
</ul>

<p>
	يمكنك استخدام أي تنسيق تريده، في لغة Ruby، يوجد مخططين لتوثيق وشرح عمل الدالّة وهما <code><a href="http://tomdoc.org/" rel="external nofollow">TomDoc</a></code> و<code><a href="https://rubydoc.info/docs/yard/file/docs/GettingStarted.md" rel="external nofollow">YARD</a></code> كما يمكنك أيضًا كتابة تعليقات موجزة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_41" style=""><span class="com"># Returns the fallback locales for the_locale.</span><span class="pln">
</span><span class="com"># If opts[:exclude_default] is set, the default locale, which is otherwise</span><span class="pln">
</span><span class="com"># always the last one in the returned list, will be excluded.</span><span class="pln">
</span><span class="com">#</span><span class="pln">
</span><span class="com"># For example:</span><span class="pln">
</span><span class="com">#   fallbacks_for(:"pt-BR")</span><span class="pln">
</span><span class="com">#     =&gt; [:"pt-BR", :pt, :en]</span><span class="pln">
</span><span class="com">#   fallbacks_for(:"pt-BR", :exclude_default =&gt; true)</span><span class="pln">
</span><span class="com">#     =&gt; [:"pt-BR", :pt]</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> fallbacks_for</span><span class="pun">(</span><span class="pln">the_locale</span><span class="pun">,</span><span class="pln"> opts </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{})</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span></pre>

<h3 id="التعليقات_الكتلية_والمضمنة">
	التعليقات الكتلية والمضمّنة
</h3>

<p>
	المكان الأخير للتعليقات هو في الأجزاء الصعبة من الشيفرة البرمجية، فعّلق عليها الآن إذا توجب عليك شرحها عند مراجعة القادمة للشيفرة البرمجية. يجب أن تحصل العمليات المعقدة على بضعة أسطر من التعليقات قبل بدء العمليات، بالنسبة للأجزاء غير الواضحة فإنها التعليقات ستكون في نهاية السطر.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_43" style=""><span class="kwd">def</span><span class="pln"> fallbacks_for</span><span class="pun">(</span><span class="pln">the_locale</span><span class="pun">,</span><span class="pln"> opts </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{})</span><span class="pln">
  </span><span class="com"># dup() to produce an array that we can mutate.</span><span class="pln">
  ret </span><span class="pun">=</span><span class="pln"> </span><span class="lit">@fallbacks</span><span class="pun">[</span><span class="pln">the_locale</span><span class="pun">].</span><span class="pln">dup

  </span><span class="com"># We make two assumptions here:</span><span class="pln">
  </span><span class="com"># 1) There is only one default locale (that is, it has no less-specific</span><span class="pln">
  </span><span class="com">#    children).</span><span class="pln">
  </span><span class="com"># 2) The default locale is just a language. (Like :en, and not :"en-US".)</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> opts</span><span class="pun">[:</span><span class="pln">exclude_default</span><span class="pun">]</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
      ret</span><span class="pun">.</span><span class="pln">last </span><span class="pun">==</span><span class="pln"> default_locale </span><span class="pun">&amp;&amp;</span><span class="pln">
      ret</span><span class="pun">.</span><span class="pln">last </span><span class="pun">!=</span><span class="pln"> language_from_locale</span><span class="pun">(</span><span class="pln">the_locale</span><span class="pun">)</span><span class="pln">
    ret</span><span class="pun">.</span><span class="pln">pop
  </span><span class="kwd">end</span><span class="pln">

  ret
</span><span class="kwd">end</span></pre>

<p>
	من ناحية أخرى، لا تصف طريقة عمل التعليمات البرمجية، افترض أن الشخص الذي يقرأ شيفرتك البرمجية يعرف اللغة البرمجية (وإن لم يكن ما تحاول القيام به) أفضل منك.
</p>

<p>
	وفي سياق متصل: لا تستخدم التعليقات الكتلية، فلا يمكن أن تسبقها بمسافة وليس من السهل رؤيتها كالتعليقات العادية.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_45" style=""><span class="com"># bad</span><span class="pln">
</span><span class="pun">=</span><span class="kwd">begin</span><span class="pln">
comment line
another comment line
</span><span class="pun">=</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="com"># comment line</span><span class="pln">
</span><span class="com"># another comment line</span></pre>

<h3 id="علامات_الترقيم_والإملاء_والنحو">
	علامات الترقيم والإملاء والنحو
</h3>

<p>
	اهتم بعلامات الترقيم، والإملاء، والنحو. فمن السهل قراءة التعليقات المكتوبة بعناية على عكس نظيرتها غير المكتوبة بعناية.
</p>

<p>
	ينبغي أن تكون التعليقات قابلة للقراءة كنص سردي، مع وجود الحروف الكبيرة وعلامات الترقيم المناسبة. في حالات كثيرة، تكون الجمل الكاملة قابلة للقراءة أكثر من الجمل القصيرة.
</p>

<p>
	يمكن للتعليقات القصيرة، مثل الّتي توضع في نهاية آخر سطر في شيفرة برمجية أن تكون أقل رسمية، لكن على كلّ الأحوال يجب أن تكون متسقة مع تنسيقك للتعليقات ككلّ.
</p>

<p>
	على الرغم من أنه من المحبط أن يشير مُراجِع لشيفرتك البرمجية لاستخدامك فاصلة عادية في مكان الفاصلة المنقوطة، لذا من المهم أن تحافظ على شيفرتك البرمجية لتكون بمستوى عالٍ من الوضوح وقابلية القراءة، وستُساعدنا علامات الترقيم والكتابة الإملائية الصحيحة واستخدام الصحيح للقواعد النحوية في تحقيق هذا الهدف.
</p>

<h3 id="تعليقات_TODO">
	تعليقات TODO
</h3>

<p>
	استخدم تعليقات TODO للشيفرات البرمجية المؤقتة، أو للحلّ قصير الأجل، أو الحلّ الجيد بما يكفي ولكنه ليس مثاليًا. يجب أن تتضمن تعليقات TODO على كلمة TODO بالأحرف الكبيرة متبوعة بالاسم الكامل للشخص الذي يمكنه توفير أفضل حل للمشكلة في الشيفرة المشار إليها من قِبل تعليق TODO بين قوسين. يمكنك إضافة النقطتين ومن ثمّ ضع تعليق يشرح ما يجب القيام به، فالغرض الرئيسي هو تنسيق تعليق TODO ليصبح قابلًا للبحث ليجده الشخص الّذي يمكنه توفير مزيد من التفاصيل عند الطلب. إن تعليق TODO لا يُلزم الشخص المشار إليه لإصلاح المشكلة، ولذلك عند إنشائك تعليق TODO، فغالبًا -إن لم يكن دائمًا- ستكتب اسمك.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_49" style=""><span class="pln">  </span><span class="com"># bad</span><span class="pln">
  </span><span class="com"># TODO(RS): Use proper namespacing for this constant.</span><span class="pln">

  </span><span class="com"># bad</span><span class="pln">
  </span><span class="com"># TODO(drumm3rz4lyfe): Use proper namespacing for this constant.</span><span class="pln">

  </span><span class="com"># good</span><span class="pln">
  </span><span class="com"># TODO(Ringo Starr): Use proper namespacing for this constant.</span></pre>

<h3 id="شيفرات_برمجية_بدون_تعليقات">
	شيفرات برمجية بدون تعليقات
</h3>

<ul>
	<li>
		لا تترك أبدًا شيفراتك البرمجية بدون تعليقات.
	</li>
</ul>

<h2 id="الدوال">
	الدوال
</h2>

<h3 id="تعريف_الدوال">
	تعريف الدوال
</h3>

<ul>
	<li>
		<p>
			استخدم الكلمة المفتاحية <code>def</code> مع الأقواس عند وجود وسطاء، واحذف الأقواس عندما لا تقبل الدوالّ أي وسطاء.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_441_51" style=""><span class="kwd">def</span><span class="pln"> some_method
  </span><span class="com"># body omitted</span><span class="pln">
end

</span><span class="kwd">def</span><span class="pln"> some_method_with_parameters</span><span class="pun">(</span><span class="pln">arg1</span><span class="pun">,</span><span class="pln"> arg2</span><span class="pun">)</span><span class="pln">
  </span><span class="com"># body omitted</span><span class="pln">
end</span></pre>

<ul>
	<li>
		<p>
			لا تستخدم الوسطاء الموضوعة افتراضيًا، بل استخدم معاملات الكلمات الرئيسية (keyword) – الموجودة في إصدار لغة روبي Ruby 2.0 أو الأحدث - أو يمكنك استخدام أسماء hash أيضًا.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_53" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> obliterate</span><span class="pun">(</span><span class="pln">things</span><span class="pun">,</span><span class="pln"> gently </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln"> except </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[],</span><span class="pln"> at </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Time</span><span class="pun">.</span><span class="pln">now</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> obliterate</span><span class="pun">(</span><span class="pln">things</span><span class="pun">,</span><span class="pln"> gently</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln"> except</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[],</span><span class="pln"> at</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Time</span><span class="pun">.</span><span class="pln">now</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> obliterate</span><span class="pun">(</span><span class="pln">things</span><span class="pun">,</span><span class="pln"> options </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{})</span><span class="pln">
  options </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">:</span><span class="pln">gently </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln"> </span><span class="com"># obliterate with soft-delete</span><span class="pln">
    </span><span class="pun">:</span><span class="pln">except </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[],</span><span class="pln"> </span><span class="com"># skip obliterating these things</span><span class="pln">
    </span><span class="pun">:</span><span class="pln">at </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Time</span><span class="pun">.</span><span class="pln">now</span><span class="pun">,</span><span class="pln"> </span><span class="com"># don't obliterate them until later</span><span class="pln">
  </span><span class="pun">}.</span><span class="pln">merge</span><span class="pun">(</span><span class="pln">options</span><span class="pun">)</span><span class="pln">

  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	تجنب الدوالّ المتكونة من سطر واحد، على الرغم من انتشارها، إلا أنه توجد بعض الغرابة حول طريقة صياغتها مما يجعل استخدامها أمرًا غير مرغوب به.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_55" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> too_much</span><span class="pun">;</span><span class="pln"> something</span><span class="pun">;</span><span class="pln"> something_else</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> some_method
  </span><span class="com"># body</span><span class="pln">
</span><span class="kwd">end</span></pre>

<h3 id="دوال_الاستدعاء">
	دوال الاستدعاء
</h3>

<p>
	<strong>استخدم الأقواس</strong> لدالة الاستدعاء في الحالات التالية:
</p>

<ul>
	<li>
		<p>
			إذا كانت الدالة ترجع قيمة.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_57" style=""><span class="com"># bad</span><span class="pln">
</span><span class="lit">@current_user</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">User</span><span class="pun">.</span><span class="pln">find_by_id </span><span class="lit">1964192</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="lit">@current_user</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">User</span><span class="pun">.</span><span class="pln">find_by_id</span><span class="pun">(</span><span class="lit">1964192</span><span class="pun">)</span></pre>

<ul>
	<li>
		<p>
			إذا كان الوسيط الأول للدالّة يستخدم الأقواس.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_59" style=""><span class="com"># bad</span><span class="pln">
put</span><span class="pun">!</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> y</span><span class="pun">)</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> len</span><span class="pun">,</span><span class="pln"> value

</span><span class="com"># good</span><span class="pln">
put</span><span class="pun">!((</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> y</span><span class="pun">)</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> len</span><span class="pun">,</span><span class="pln"> value</span><span class="pun">)</span></pre>

<ul>
	<li>
		<p>
			لا تضع أبدًا مسافة بين اسم الدالّة والقوس الأول.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_61" style=""><span class="com"># bad</span><span class="pln">
f </span><span class="pun">(</span><span class="lit">3</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
f</span><span class="pun">(</span><span class="lit">3</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span></pre>

<ul>
	<li>
		<p>
			تجنب الأقواس عند استدعاء الدالّة إذا لم تقبل الدالّة أي وسطاء.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_63" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">nil</span><span class="pun">?()</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">nil</span><span class="pun">?</span></pre>

<ul>
	<li>
		<p>
			ستكون الأقواس اختيارية ما لم تكن الدالة تُعيدّ قيمة (أو لا نهتم بما تُعيده)، أما إذا كان الوسطاء في عدة أسطر، فيمكن للأقواس أن تزيد من قابلية القراءة.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_65" style=""><span class="com"># okay</span><span class="pln">
render</span><span class="pun">(:</span><span class="pln">partial </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'foo'</span><span class="pun">)</span><span class="pln">

</span><span class="com"># okay</span><span class="pln">
render </span><span class="pun">:</span><span class="pln">partial </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'foo'</span></pre>

<p>
	في كِلا الحالتين:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_67" style=""><span class="com"># bad</span><span class="pln">
get </span><span class="str">'/v1/reservations'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">:</span><span class="pln">id </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">54875</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
get </span><span class="str">'/v1/reservations'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">:</span><span class="pln">id </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">54875</span></pre>

<ul>
	<li>
		في حالة قبول الدالة hash كوسيط أخير اختياري، لا تستخدم الأقواس <code>{</code> أو <code>}</code> أثناء الاستدعاء.
	</li>
</ul>

<h2 id="التعابير_الشرطية">
	التعابير الشرطيّة
</h2>

<h3 id="الكلمات_المفتاحية_للجمل_الشرطية">
	الكلمات المفتاحية للجمل الشرطية
</h3>

<ul>
	<li>
		<p>
			لا تستخدم الكلمة المفتاحية <code>then</code> للجملة الشرطية <code>if/unless</code> المتعددة الأسطر.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_69" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> some_condition </span><span class="kwd">then</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> some_condition
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			لا تستخدم الكلمة المفتاحية <code>do</code> مع <code>while</code> أو <code>until</code> المتعددات الأسطر.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_71" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="kwd">until</span><span class="pln"> x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="kwd">until</span><span class="pln"> x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			إن الكلمات المفتاحية <code>and</code> و<code>or</code> و<code>not</code> محظورة، فهي لا تستحق العناء، استخدم دائمًا <code>&amp;&amp;</code> و<code>||</code> و<code>!</code> بدلًا منها.
		</p>
	</li>
	<li>
		<p>
			يمكنك استخدام المعدِل <code>if/unless</code> عندما يكون الجسم بسيط والشرط بسيط وكلّ شيء في سطر واحد، وخلافًا لذلك، تجنب استخدام <code>if/unless</code>.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_73" style=""><span class="com"># bad - this doesn't fit on one line</span><span class="pln">
add_trebuchet_experiments_on_page</span><span class="pun">(</span><span class="pln">request_opts</span><span class="pun">[:</span><span class="pln">trebuchet_experiments_on_page</span><span class="pun">])</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> request_opts</span><span class="pun">[:</span><span class="pln">trebuchet_experiments_on_page</span><span class="pun">]</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">!</span><span class="pln">request_opts</span><span class="pun">[:</span><span class="pln">trebuchet_experiments_on_page</span><span class="pun">].</span><span class="pln">empty</span><span class="pun">?</span><span class="pln">

</span><span class="com"># okay</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> request_opts</span><span class="pun">[:</span><span class="pln">trebuchet_experiments_on_page</span><span class="pun">]</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
     </span><span class="pun">!</span><span class="pln">request_opts</span><span class="pun">[:</span><span class="pln">trebuchet_experiments_on_page</span><span class="pun">].</span><span class="pln">empty</span><span class="pun">?</span><span class="pln">

  add_trebuchet_experiments_on_page</span><span class="pun">(</span><span class="pln">request_opts</span><span class="pun">[:</span><span class="pln">trebuchet_experiments_on_page</span><span class="pun">])</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># bad - this is complex and deserves multiple lines and a comment</span><span class="pln">
parts</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> part</span><span class="pun">.</span><span class="pln">to_i</span><span class="pun">(</span><span class="pln">INTEGER_BASE</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">!</span><span class="pln">part</span><span class="pun">.</span><span class="kwd">nil</span><span class="pun">?</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">[</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">include</span><span class="pun">?(</span><span class="pln">i</span><span class="pun">)</span><span class="pln">

</span><span class="com"># okay</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> reconciled</span><span class="pun">?</span></pre>

<ul>
	<li>
		<p>
			لا تستخدم أبدًا الكلمة المفتاحية <code>unless</code> مع <code>else</code>، أعد كتابة الشرط لتصبح الحالة الصحيحة الأولى أولًا.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_75" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">unless</span><span class="pln"> success</span><span class="pun">?</span><span class="pln">
  puts </span><span class="str">'failure'</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
  puts </span><span class="str">'success'</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> success</span><span class="pun">?</span><span class="pln">
  puts </span><span class="str">'success'</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
  puts </span><span class="str">'failure'</span><span class="pln">
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			تجنب <code>unless</code> مع الشروط المتعددة.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_77" style=""><span class="pln">  </span><span class="com"># bad</span><span class="pln">
  </span><span class="kwd">unless</span><span class="pln"> foo</span><span class="pun">?</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> bar</span><span class="pun">?</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">

  </span><span class="com"># okay</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">!(</span><span class="pln">foo</span><span class="pun">?</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> bar</span><span class="pun">?)</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			تجنب استخدام <code>unless</code> مع معاملات الموازنة فإن استطعت استخدام الشرط <code>if</code> مع عكس الشرط الموجود في <code>unless</code> ففعل ذلك.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_79" style=""><span class="pln">  </span><span class="com"># bad</span><span class="pln">
  </span><span class="kwd">unless</span><span class="pln"> x </span><span class="pun">==</span><span class="pln"> </span><span class="lit">10</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">

  </span><span class="com"># good</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> x </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">10</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">

  </span><span class="com"># bad</span><span class="pln">
  </span><span class="kwd">unless</span><span class="pln"> x </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">10</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">

  </span><span class="com"># good</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> x </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">10</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">

  </span><span class="com"># ok</span><span class="pln">
  </span><span class="kwd">unless</span><span class="pln"> x </span><span class="pun">===</span><span class="pln"> </span><span class="lit">10</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			لا تستخدم أقواسًا حول الشروط <code>if/unless/while</code>.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_81" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">10</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span></pre>

<h3 id="المعامل_الثلاثي">
	المعامل الثلاثي
</h3>

<ul>
	<li>
		<p>
			تجنب استخدام العامل الثلاثي (<code>:?</code>) إلا في الحالات الّتي تكون فيها جميع التعابير بسيطة، إلا أنه يمكنك استخدامه بدلًا من <code>if/then/else/end</code> في الشروط المتكونة من سطر واحد.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_83" style=""><span class="com"># bad</span><span class="pln">
result </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> some_condition </span><span class="kwd">then</span><span class="pln"> something </span><span class="kwd">else</span><span class="pln"> something_else </span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
result </span><span class="pun">=</span><span class="pln"> some_condition </span><span class="pun">?</span><span class="pln"> something </span><span class="pun">:</span><span class="pln"> something_else</span></pre>

<ul>
	<li>
		<p>
			استخدم تعبير واحد لكلّ فرع في المعامل الثلاثي، كذلك يجب ألا يكون المعامل الثلاثي متشعبًا، إذ يُفضّل استخدام بنية <code>if/else</code> في هذه الحالات.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_85" style=""><span class="com"># bad</span><span class="pln">
some_condition </span><span class="pun">?</span><span class="pln"> </span><span class="pun">(</span><span class="pln">nested_condition </span><span class="pun">?</span><span class="pln"> nested_something </span><span class="pun">:</span><span class="pln"> nested_something_else</span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> something_else

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> some_condition
  nested_condition </span><span class="pun">?</span><span class="pln"> nested_something </span><span class="pun">:</span><span class="pln"> nested_something_else
</span><span class="kwd">else</span><span class="pln">
  something_else
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			تجنب الشروط المتعدّدة في المعامل الثلاثي إذ يُفضّل استخدام الأخير مع الشروط الفردية.
		</p>
	</li>
	<li>
		<p>
			تجنب الأسطر المتعدّدة <code>:?</code> في المعامل الثلاثي، واستخدم <code>if/then/else/end</code> بدلا منه.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_87" style=""><span class="com"># bad</span><span class="pln">
some_really_long_condition_that_might_make_you_want_to_split_lines </span><span class="pun">?</span><span class="pln">
  something </span><span class="pun">:</span><span class="pln"> something_else

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> some_really_long_condition_that_might_make_you_want_to_split_lines
  something
</span><span class="kwd">else</span><span class="pln">
  something_else
</span><span class="kwd">end</span></pre>

<h3 id="الشروط_المتشعبة">
	الشروط المتشعّبة
</h3>

<ul>
	<li>
		<p>
			تجنب استخدام الشروط المتشعّبة لزيادة التحكم بالشيفرة (يمكنك الاطلاع على هذا <a href="http://blog.timoxley.com/post/47041269194/avoid-else-return-early" rel="external nofollow">المقال</a> لمزيد من المعلومات).
		</p>

		<p>
			يُفضّل استخدام تعبير الحراسة (<code>guard clause</code>) عندما تريد التحقق بيانات غير صالحة، <strong>فشرط الحراسة</strong> هو عبارة شرطية في أعلى الدالة التي تعيد النتيجة بأسرع ما يمكن.
		</p>

		<p>
			المبادئ العامة هي:
		</p>

		<ul>
			<li>
				أعدّ القيمة (النتيجة) مباشرة بمجرد معرفتك بأن الدالّة لا طائل منها، أو أنها لا تضف أي زيادة حقيقة للشيفرة.
			</li>
			<li>
				قلل التشعّب والمسافات البادئة في الشيفرة البرمجة من خلال إعادة النتيجة بأسرع وقت ممكن. وهذا يجعل الشيفرات البرمجية أسهل للقراءة، وتتطلّب جهدً عقليًا أقل أثناء قراءة الفرع الثاني من الشرط <code>else</code>.
			</li>
			<li>
				ينبغي أن تكون الشروط الجوهرية أو الأكثر أهمية ذات مسافات بادئة أقل
			</li>
		</ul>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_89" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> compute
  server </span><span class="pun">=</span><span class="pln"> find_server
  </span><span class="kwd">if</span><span class="pln"> server
    client </span><span class="pun">=</span><span class="pln"> server</span><span class="pun">.</span><span class="pln">client
    </span><span class="kwd">if</span><span class="pln"> client
      request </span><span class="pun">=</span><span class="pln"> client</span><span class="pun">.</span><span class="pln">make_request
      </span><span class="kwd">if</span><span class="pln"> request
         process_request</span><span class="pun">(</span><span class="pln">request</span><span class="pun">)</span><span class="pln">
      </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> compute
  server </span><span class="pun">=</span><span class="pln"> find_server
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">unless</span><span class="pln"> server
  client </span><span class="pun">=</span><span class="pln"> server</span><span class="pun">.</span><span class="pln">client
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">unless</span><span class="pln"> client
  request </span><span class="pun">=</span><span class="pln"> client</span><span class="pun">.</span><span class="pln">make_request
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">unless</span><span class="pln"> request
  process_request</span><span class="pun">(</span><span class="pln">request</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	يُفضّل استخدام <code>next</code> في الحلقات بدلًا من الكتل الشرطيّة.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_93" style=""><span class="com"># bad</span><span class="pln">
</span><span class="pun">[</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">each </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">item</span><span class="pun">|</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> item </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
    puts item
  </span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="pun">[</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">each </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">item</span><span class="pun">|</span><span class="pln">
  </span><span class="kwd">next</span><span class="pln"> </span><span class="kwd">unless</span><span class="pln"> item </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
  puts item
</span><span class="kwd">end</span></pre>

<h3 id="الصياغة">
	الصياغة
</h3>

<ul>
	<li>
		<p>
			لا تستخدم <code>for</code> إلّا إذا كنت تعرّف تمامًا لماذا ستستخدمها، فغالبًا، يجب استخدام المكرّرات (<code>iterator</code>) بدلًا منها، فتعمل <code>for</code> بنفس شروط <code>each</code> (أي أنك ستضيف مستوى جديد من المراوغة للبرنامج) لكن مع عيب صغير، فلا تُعرّف <code>for</code> نطاق جديد (على عكس <code>each</code>) وستظهر المتغيرات المعرّفة في كتلتها خارجيًا.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_96" style=""><span class="pln">arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">]</span><span class="pln">

</span><span class="com"># bad</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> elem </span><span class="kwd">in</span><span class="pln"> arr </span><span class="kwd">do</span><span class="pln">
  puts elem
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
arr</span><span class="pun">.</span><span class="pln">each </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">elem</span><span class="pun">|</span><span class="pln"> puts elem </span><span class="pun">}</span></pre>

<ul>
	<li>
		<p>
			يفضل استخدام <code>{...}</code> بدلًا من <code>do...end</code> للكتل المكوّنة من سطر واحد، وتجنّب استخدام <code>{...}</code> للكتل المكونة من عدة أسطر (فسَلّسَلةُ عدة أسطر هو شيء قبيح)، واستخدم <code>do...end</code> دائمًا للتحكم في التدفّق ولتعريف الدوالّ، وتجنب استخدام <code>do...end</code> عند السَلّسَلة.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_98" style=""><span class="pln">names </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Bozhidar"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Steve"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Sarah"</span><span class="pun">]</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
names</span><span class="pun">.</span><span class="pln">each </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">name</span><span class="pun">|</span><span class="pln"> puts name </span><span class="pun">}</span><span class="pln">

</span><span class="com"># bad</span><span class="pln">
names</span><span class="pun">.</span><span class="pln">each </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">name</span><span class="pun">|</span><span class="pln"> puts name </span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
names</span><span class="pun">.</span><span class="pln">each </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">name</span><span class="pun">|</span><span class="pln">
  puts name
  puts </span><span class="str">'yay!'</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># bad</span><span class="pln">
names</span><span class="pun">.</span><span class="pln">each </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">name</span><span class="pun">|</span><span class="pln">
  puts name
  puts </span><span class="str">'yay!'</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
names</span><span class="pun">.</span><span class="pln">select </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">name</span><span class="pun">|</span><span class="pln"> name</span><span class="pun">.</span><span class="pln">start_with</span><span class="pun">?(</span><span class="str">"S"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">}.</span><span class="pln">map </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">name</span><span class="pun">|</span><span class="pln"> name</span><span class="pun">.</span><span class="pln">upcase </span><span class="pun">}</span><span class="pln">

</span><span class="com"># bad</span><span class="pln">
names</span><span class="pun">.</span><span class="pln">select </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">name</span><span class="pun">|</span><span class="pln">
  name</span><span class="pun">.</span><span class="pln">start_with</span><span class="pun">?(</span><span class="str">"S"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">end</span><span class="pun">.</span><span class="pln">map </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">name</span><span class="pun">|</span><span class="pln"> name</span><span class="pun">.</span><span class="pln">upcase </span><span class="pun">}</span></pre>

<p>
	سيُجادلنا البعض ويقول أن سَلّسَلَة الأسطر المتعددة تبدو جيّدة عند استخدام <code>{...}</code>، لكن هل سألوا أنفسهم هل هذه الشيفرة البرمجية قابلة للقراءة حقًا. وهل يمكن استخلاص محتوى الكتلة لوضعها في دوالّ فعّالة.
</p>

<ul>
	<li>
		<p>
			استخدم معاملات الإسناد المختصرة كلما كان ذلك ممكنًا.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_100" style=""><span class="com"># bad</span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> y
x </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> y
x </span><span class="pun">=</span><span class="pln"> x</span><span class="pun">**</span><span class="pln">y
x </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">/</span><span class="pln"> y
x </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">||</span><span class="pln"> y
x </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">&amp;&amp;</span><span class="pln"> y

</span><span class="com"># good</span><span class="pln">
x </span><span class="pun">+=</span><span class="pln"> y
x </span><span class="pun">*=</span><span class="pln"> y
x </span><span class="pun">**=</span><span class="pln"> y
x </span><span class="pun">/=</span><span class="pln"> y
x </span><span class="pun">||=</span><span class="pln"> y
x </span><span class="pun">&amp;&amp;=</span><span class="pln"> y</span></pre>

<ul>
	<li>
		<p>
			تجنب الفواصل المنقوطة باستثناء حالة تعريفك لصنف ذو سطر واحد، وعندما يكون من الملائم استخدام فاصلة منقوطة، ينبغي أن تكون متاخمة مباشرةً للعبارة التي ستنهيها. لا يجب ترك مسافة قبل الفاصلة المنقوطة.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_102" style=""><span class="com"># bad</span><span class="pln">
puts </span><span class="str">'foobar'</span><span class="pun">;</span><span class="pln"> </span><span class="com"># superfluous semicolon</span><span class="pln">
puts </span><span class="str">'foo'</span><span class="pun">;</span><span class="pln"> puts </span><span class="str">'bar'</span><span class="pln"> </span><span class="com"># two expressions on the same line</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
puts </span><span class="str">'foobar'</span><span class="pln">

puts </span><span class="str">'foo'</span><span class="pln">
puts </span><span class="str">'bar'</span><span class="pln">

puts </span><span class="str">'foo'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'bar'</span><span class="pln"> </span><span class="com"># this applies to puts in particular</span></pre>

<ul>
	<li>
		<p>
			استخدم <code>::</code> للثوابت المرجعيّة فقط (ويشمل هذا الأصناف والوحدات) والبواني (مثل: <code>Array()‎</code> أو <code>Nokogiri::HTML()‎</code>) ولا تستخدم <code>::</code> لاستدعاء الدالّة العادية.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_104" style=""><span class="com"># bad</span><span class="pln">
</span><span class="typ">SomeClass</span><span class="pun">::</span><span class="pln">some_method
some_object</span><span class="pun">::</span><span class="pln">some_method

</span><span class="com"># good</span><span class="pln">
</span><span class="typ">SomeClass</span><span class="pun">.</span><span class="pln">some_method
some_object</span><span class="pun">.</span><span class="pln">some_method
</span><span class="typ">SomeModule</span><span class="pun">::</span><span class="typ">SomeClass</span><span class="pun">::</span><span class="pln">SOME_CONST
</span><span class="typ">SomeModule</span><span class="pun">::</span><span class="typ">SomeClass</span><span class="pun">()</span></pre>

<ul>
	<li>
		<p>
			تجنب استخدام <code>return</code> عندما تكون غير مطلوبة.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_106" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> some_method</span><span class="pun">(</span><span class="pln">some_arr</span><span class="pun">)</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> some_arr</span><span class="pun">.</span><span class="pln">size
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> some_method</span><span class="pun">(</span><span class="pln">some_arr</span><span class="pun">)</span><span class="pln">
  some_arr</span><span class="pun">.</span><span class="pln">size
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			لا تستخدم القيمة المُعادة من المساواة <code>=</code> في الجمل الشرطيّة.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_108" style=""><span class="com"># bad - shows intended use of assignment</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">v </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">.</span><span class="pln">grep</span><span class="pun">(</span><span class="str">/foo/</span><span class="pun">))</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># bad</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> v </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">.</span><span class="pln">grep</span><span class="pun">(</span><span class="str">/foo/</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
v </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">.</span><span class="pln">grep</span><span class="pun">(</span><span class="str">/foo/</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> v
  </span><span class="pun">...</span><span class="pln">
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			استخدم ‎<code>||=‎</code> كما تريد لتهيئة المتغيّرات.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_112" style=""><span class="com"># set name to Bozhidar, only if it's nil or false name ||= 'Bozhidar'</span></pre>

<ul>
	<li>
		<p>
			لا تستخدم ‎<code>||=</code>‎ لتهيئة المتغيرات المنطقيّة، (فكر في ما سيحدث إذا كانت القيمة الحالية تساوي <code>false</code>).
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_110" style=""><span class="com"># bad - would set enabled to true even if it was false</span><span class="pln">
enabled </span><span class="pun">||=</span><span class="pln"> </span><span class="kwd">true</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
enabled </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> enabled</span><span class="pun">.</span><span class="kwd">nil</span><span class="pun">?</span></pre>

<ul>
	<li>
		<p>
			استخدم <code>‎.call</code> الصريحة عند استدعاء <code>lambda</code>.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_114" style=""><span class="com"># bad</span><span class="pln">
lambda</span><span class="pun">.(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
lambda</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span></pre>

<ul>
	<li>
		<p>
			تجنب استخدام متغيرات الخاصة على نمط بيرل Perl (مثل: <code>$</code> أو <code>‎$0-9</code> …إلخ)، فهي مبهمة فعلًا. واستخدامها سيُعيقنا بكلّ شيئ عدا في السكربتات ذات السطر الواحد. يُفضّل اصدارات ذات الشكل الطويل مثل: <code>‎$PROGRAM_NAME</code>.
		</p>
	</li>
	<li>
		<p>
			استخدم الاختصار <code>&amp;:</code> عندما تأخذ كتلة الدالّة وسيط واحد فقط، ويعمل الجسم على قراءة سِمة أو استدعاء دالّة بدون وسطاء .
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_116" style=""><span class="com"># bad</span><span class="pln">
bluths</span><span class="pun">.</span><span class="pln">map </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">bluth</span><span class="pun">|</span><span class="pln"> bluth</span><span class="pun">.</span><span class="pln">occupation </span><span class="pun">}</span><span class="pln">
bluths</span><span class="pun">.</span><span class="pln">select </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">bluth</span><span class="pun">|</span><span class="pln"> bluth</span><span class="pun">.</span><span class="pln">blue_self</span><span class="pun">?</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
bluths</span><span class="pun">.</span><span class="pln">map</span><span class="pun">(&amp;:</span><span class="pln">occupation</span><span class="pun">)</span><span class="pln">
bluths</span><span class="pun">.</span><span class="pln">select</span><span class="pun">(&amp;:</span><span class="pln">blue_self</span><span class="pun">?)</span></pre>

<ul>
	<li>
		<p>
			يفضلُ استخدام <code>some_method</code> على <code>self.some_method</code> عند استدعاء الدالّة داخليًا.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_118" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> end_date
  </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">start_date </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">nights
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> end_date
  start_date </span><span class="pun">+</span><span class="pln"> nights
</span><span class="kwd">end</span></pre>

<p>
	يجب عليك استخدام <code>self.‎</code> في الحالات الثلاثة التالية:
</p>

<ol>
	<li>
		عند تعريف دالّة صنف: <code>def self.some_method</code>.
	</li>
	<li>
		عندما تكون <code>self</code> هي نموذج سجل فعالّ <code>ActiveRecord</code> ويكون الجانب الأيسر هو استدعاء دالّة اِسناد بما في ذلك اِسناد سِمة: <code>self.guest = user</code>.
	</li>
	<li>
		الإشارة للصنف داخليًا: <code>self.class</code>.
	</li>
</ol>

<ul>
	<li>
		<p>
			عند تعريف كائن من أي نوع قابل للتحويل وتريده أن يكون ثابتًا، تأكد من استدعاء <code>freeze</code> عليه، ومن الأمثلة الشائعة على ذلك هي السلاسل النصية، والمصفوفات، ومتغيرات من نوع <code>hash</code> (انظر لهذا <a href="https://blog.honeybadger.io/when-to-use-freeze-and-frozen-in-ruby/" rel="external nofollow">المقال</a> لمزيد من المعلومات). والسبب في ذلك أن الثوابت في لفة روبي (Ruby) هي أنواع قابلة للتحويل، وبعضها الآخر ليس كذلك. ستتأكد من عدم قابليتها للتحويل عند استدعاء <code>freeze</code> عليها لأنه سيصدر استثناء عند محاولة تعديلهم إن كانت غير قابلة للتعديل، وبالنسبة للسلاسل النصية، سيُسمح بالتعامل معهم لنسخ روبي ذات الاصدار الأقدم من 2.2.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_120" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Color</span><span class="pln">
  RED </span><span class="pun">=</span><span class="pln"> </span><span class="str">'red'</span><span class="pln">
  BLUE </span><span class="pun">=</span><span class="pln"> </span><span class="str">'blue'</span><span class="pln">
  GREEN </span><span class="pun">=</span><span class="pln"> </span><span class="str">'green'</span><span class="pln">

  ALL_COLORS </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    RED</span><span class="pun">,</span><span class="pln">
    BLUE</span><span class="pun">,</span><span class="pln">
    GREEN</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">]</span><span class="pln">

  COLOR_TO_RGB </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    RED </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">0xFF0000</span><span class="pun">,</span><span class="pln">
    BLUE </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">0x0000FF</span><span class="pun">,</span><span class="pln">
    GREEN </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">0x00FF00</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Color</span><span class="pln">
  RED </span><span class="pun">=</span><span class="pln"> </span><span class="str">'red'</span><span class="pun">.</span><span class="pln">freeze
  BLUE </span><span class="pun">=</span><span class="pln"> </span><span class="str">'blue'</span><span class="pun">.</span><span class="pln">freeze
  GREEN </span><span class="pun">=</span><span class="pln"> </span><span class="str">'green'</span><span class="pun">.</span><span class="pln">freeze

  ALL_COLORS </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    RED</span><span class="pun">,</span><span class="pln">
    BLUE</span><span class="pun">,</span><span class="pln">
    GREEN</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">].</span><span class="pln">freeze

  COLOR_TO_RGB </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    RED </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">0xFF0000</span><span class="pun">,</span><span class="pln">
    BLUE </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">0x0000FF</span><span class="pun">,</span><span class="pln">
    GREEN </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">0x00FF00</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">}.</span><span class="pln">freeze
</span><span class="kwd">end</span></pre>

<h2 id="قواعد_التسمية">
	قواعد التسمية
</h2>

<ul>
	<li>
		استخدم أسلوب التسمية <code>snake_case</code> (جميع حروف اسم المتغير صغيرة) للدوالّ والمتغيرات.
	</li>
	<li>
		استخدم أسلوب التسمية <code>camelCase</code> (تكبير أول حرف من كلّ كلمة في اسم المتغير عدا أول كلمة) للأصناف والوحدات. (احتفظ بالاختصارات مثل" HTTP وRFC وXML بحالة حروف كبيرة).
	</li>
	<li>
		استخدم أسلوب التسمية <code>SCREAMING_SNAKE_CASE</code> (جميع حروف اسم المتغير كبيرة) للثوابت الأخرى.
	</li>
	<li>
		يجب أن تنتهي الدوالّ الإسنادية (الّتي ترجع قيمة منطقية) بعلامة استفهام. (هكذا: <code>Array#empty?</code>‎).
	</li>
	<li>
		يجب أن تنتهي أسماء الدوالّ التي يُحتمل أن تكون خطرة (مثل الدوالّ الّتي تُعدلّ <code>self</code> أو الوسطاء، أو <code>exit!‎</code> …إلخ) بعلامة تعجب، ويجب أن تتواجد الدوالّ الخطرة (<code>bang</code>) إذا تتواجدت الدوالّ غير الخطرة (<code>non-bang</code>) معها (يمكنك الاطلاع على <a href="http://dablog.rubypal.com/2007/8/15/bang-methods-or-danger-will-rubyist" rel="external nofollow">المقال</a> للمزيد من المعلومات).
	</li>
	<li>
		سمِّ متغيّرات رمي الأخطاء <code>_</code>.
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_122" style=""><span class="pln">version </span><span class="pun">=</span><span class="pln"> </span><span class="str">'3.2.1'</span><span class="pln">
major_version</span><span class="pun">,</span><span class="pln"> minor_version</span><span class="pun">,</span><span class="pln"> _ </span><span class="pun">=</span><span class="pln"> version</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="str">'.'</span><span class="pun">)</span></pre>

<h2 id="الأصناف">
	الأصناف
</h2>

<ul>
	<li>
		<p>
			تجنب استخدام متغيرات (<code>@@</code>) بسبب سلوكهم السيئ في الوراثة.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_124" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">Parent</span><span class="pln">
  </span><span class="pun">@</span><span class="lit">@class_var</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'parent'</span><span class="pln">

  </span><span class="kwd">def</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">print_class_var
    puts </span><span class="pun">@</span><span class="lit">@class_var</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Child</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="typ">Parent</span><span class="pln">
  </span><span class="pun">@</span><span class="lit">@class_var</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'child'</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="typ">Parent</span><span class="pun">.</span><span class="pln">print_class_var </span><span class="com"># =&gt; will print "child"</span></pre>

<p>
	كما ترى أن جميع الأصناف في التسلسل الهرمي للصنف تتشارك في متغير صنف واحد، ويجب أن تُفضّل متغيّرات مثيل الصنف على متغيّرات الصنف.
</p>

<ul>
	<li>
		<p>
			استخدم <code>def self.method</code> لتعريف الدوالّ المتفرّدة (Singleton Methods)، وسيجعل هذا الدوالّ أكثر مقاومة لتغييرات إعادة الهيكلة.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_126" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">TestClass</span><span class="pln">
  </span><span class="com"># bad</span><span class="pln">
  </span><span class="kwd">def</span><span class="pln"> </span><span class="typ">TestClass</span><span class="pun">.</span><span class="pln">some_method
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">

  </span><span class="com"># good</span><span class="pln">
  </span><span class="kwd">def</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">some_other_method
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			تجنب استخدام <code>class &lt;&lt; self</code> إلا عند الضرورة، فمثلًا، الجالبات المفردة (<code>single accessors</code>) والسمات مستعارة (<code>aliased attributes</code>).
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_133" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">TestClass</span><span class="pln">
  </span><span class="com"># bad</span><span class="pln">
  </span><span class="kwd">class</span><span class="pln"> </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="kwd">self</span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> first_method
      </span><span class="pun">...</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">

    </span><span class="kwd">def</span><span class="pln"> second_method_etc
      </span><span class="pun">...</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">

  </span><span class="com"># good</span><span class="pln">
  </span><span class="kwd">class</span><span class="pln"> </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="kwd">self</span><span class="pln">
    attr_accessor </span><span class="pun">:</span><span class="pln">per_page
    alias_method </span><span class="pun">:</span><span class="pln">nwo</span><span class="pun">,</span><span class="pln"> </span><span class="pun">:</span><span class="pln">find_by_name_with_owner
  </span><span class="kwd">end</span><span class="pln">

  </span><span class="kwd">def</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">first_method
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">

  </span><span class="kwd">def</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">second_method_etc
    </span><span class="pun">...</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			ضع مسافة بادئة لدوالّ <code>public</code> و<code>protected</code> و<code>private</code> بقدر تعريف الدالّة الّتي ينتمون إليها، واترك سطرًا فارغًا أعلاها وأسفلها.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_135" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">SomeClass</span><span class="pln">
  </span><span class="kwd">def</span><span class="pln"> public_method
    </span><span class="com"># ...</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">

  private

  </span><span class="kwd">def</span><span class="pln"> private_method
    </span><span class="com"># ...</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span></pre>

<h2 id="الاستثناءات">
	الاستثناءات
</h2>

<ul>
	<li>
		<p>
			لا تستخدم الاستثناءات للتحكم بسير البرنامج.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_137" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">begin</span><span class="pln">
  n </span><span class="pun">/</span><span class="pln"> d
</span><span class="kwd">rescue</span><span class="pln"> </span><span class="typ">ZeroDivisionError</span><span class="pln">
  puts </span><span class="str">"Cannot divide by 0!"</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> d</span><span class="pun">.</span><span class="pln">zero</span><span class="pun">?</span><span class="pln">
  puts </span><span class="str">"Cannot divide by 0!"</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
  n </span><span class="pun">/</span><span class="pln"> d
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			تجنب إنقاذ (<code>rescue</code>) صنف الاستثناء <code>Exception</code>.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_139" style=""><span class="com"># bad</span><span class="pln">
</span><span class="kwd">begin</span><span class="pln">
  </span><span class="com"># an exception occurs here</span><span class="pln">
</span><span class="kwd">rescue</span><span class="pln"> </span><span class="typ">Exception</span><span class="pln">
  </span><span class="com"># exception handling</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">begin</span><span class="pln">
  </span><span class="com"># an exception occurs here</span><span class="pln">
</span><span class="kwd">rescue</span><span class="pln"> </span><span class="typ">StandardError</span><span class="pln">
  </span><span class="com"># exception handling</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="com"># acceptable</span><span class="pln">
</span><span class="kwd">begin</span><span class="pln">
  </span><span class="com"># an exception occurs here</span><span class="pln">
</span><span class="kwd">rescue</span><span class="pln">
  </span><span class="com"># exception handling</span><span class="pln">
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			لا تحدّد في استثناء <code>RuntimeError</code> وسيطين فقط في الكلمة المفتاحية <code>raise</code>، ومن الأفضل استخدام خطأ الأصناف الفرعية لتوضيح الخطأ وشرحه بطريقة أفضل.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_141" style=""><span class="com"># bad</span><span class="pln">
raise </span><span class="typ">RuntimeError</span><span class="pun">,</span><span class="pln"> </span><span class="str">'message'</span><span class="pln">

</span><span class="com"># better - RuntimeError is implicit here</span><span class="pln">
raise </span><span class="str">'message'</span><span class="pln">

</span><span class="com"># best</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MyExplicitError</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="typ">RuntimeError</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">end</span><span class="pln">
raise </span><span class="typ">MyExplicitError</span></pre>

<ul>
	<li>
		<p>
			يُفضّل توفير صنف استثناء والرسالة كوسيطين في الكلمة المفتاحية <code>raise</code> بدلًا من نسخة استثناء عادي.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_143" style=""><span class="com"># bad</span><span class="pln">
raise </span><span class="typ">SomeException</span><span class="pun">.</span><span class="pln">new</span><span class="pun">(</span><span class="str">'message'</span><span class="pun">)</span><span class="pln">
</span><span class="com"># Note that there is no way to do `raise SomeException.new('message'), backtrace`.</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
raise </span><span class="typ">SomeException</span><span class="pun">,</span><span class="pln"> </span><span class="str">'message'</span><span class="pln">
</span><span class="com"># Consistent with `raise SomeException, 'message', backtrace`.</span></pre>

<ul>
	<li>
		<p>
			تجنب استخدام <code>rescue</code> في شكل مُعدّل (Modifier).
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_145" style=""><span class="com"># bad</span><span class="pln">
read_file </span><span class="kwd">rescue</span><span class="pln"> handle_error</span><span class="pun">(</span><span class="pln">$</span><span class="pun">!)</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">begin</span><span class="pln">
  read_file
</span><span class="kwd">rescue</span><span class="pln"> </span><span class="typ">Errno</span><span class="pun">:</span><span class="pln">ENOENT </span><span class="pun">=&gt;</span><span class="pln"> ex
  handle_error</span><span class="pun">(</span><span class="pln">ex</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">end</span></pre>

<h2 id="التجميعات">
	التجميعات (Collections)
</h2>

<ul>
	<li>
		يفضّل استخدام الخارطة (أو الخريطة) <code>map</code> بدلًا من تجميعة <code>collect</code>.
	</li>
	<li>
		يفضّل استخدام <code>detect</code> على <code>find</code>، فاستخدام <code>find</code> غامض بسبب دالّة <code>find</code> الخاصة بكائن السجل الغعال (ActiveRecord) وسيُظهر <code>detect</code> على أنك تعمل مع تجميعة في لغة روبي وليس كائن سجل فعال.
	</li>
	<li>
		يُفضّل استخدام <code>reduce</code> على <code>inject</code>.
	</li>
	<li>
		يُفضّل استخدام <code>size</code> على <code>length</code> و<code>count</code> لتحسين أداء الشيفرة.
	</li>
	<li>
		يفّضل استخدام تدوين الإنشاء (creation notation) ومصفوفة مجزئة مصنّفة النوع (Literal)، إلّا إذا كنت بحاجة لتمرير الوسطاء لمنشئيها.
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_147" style=""><span class="com"># bad</span><span class="pln">
arr </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Array</span><span class="pun">.</span><span class="pln">new
hash </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Hash</span><span class="pun">.</span><span class="pln">new

</span><span class="com"># good</span><span class="pln">
arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
hash </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

</span><span class="com"># good because constructor requires parameters</span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Hash</span><span class="pun">.</span><span class="pln">new </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">h</span><span class="pun">,</span><span class="pln"> k</span><span class="pun">|</span><span class="pln"> h</span><span class="pun">[</span><span class="pln">k</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{}</span><span class="pln"> </span><span class="pun">}</span></pre>

<ul>
	<li>
		<p>
			يُفضّل استخدام <code>Array#join</code> بدلًا من <code>Array#*‎</code> لوضوح الشيفرة.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_149" style=""><span class="com"># bad</span><span class="pln">
</span><span class="pun">%</span><span class="pln">w</span><span class="pun">(</span><span class="pln">one two three</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="str">', '</span><span class="pln">
</span><span class="com"># =&gt; 'one, two, three'</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="pun">%</span><span class="pln">w</span><span class="pun">(</span><span class="pln">one two three</span><span class="pun">).</span><span class="pln">join</span><span class="pun">(</span><span class="str">', '</span><span class="pun">)</span><span class="pln">
</span><span class="com"># =&gt; 'one, two, three'</span></pre>

<ul>
	<li>
		<p>
			استخدم الرموز (<code>symbols</code>) بدلًا من السلاسل النصية كمفاتيح لجدول <code>Hash</code>.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_151" style=""><span class="com"># bad</span><span class="pln">
hash </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">'one'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">'two'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="str">'three'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
hash </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">:</span><span class="pln">one </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="pun">:</span><span class="pln">two </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="pun">:</span><span class="pln">three </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">}</span></pre>

<ul>
	<li>
		<p>
			على نحو مماثل، استخدم رموز واضحة بدلًا من رموز السلاسل النصية عندما يكون ذلك ممكنًا.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_153" style=""><span class="com"># bad</span><span class="pln">
</span><span class="pun">:</span><span class="str">"symbol"</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="pun">:</span><span class="pln">symbol</span></pre>

<ul>
	<li>
		<p>
			استخدم <code>Hash#key?‎</code> بدلًا من <code>Hash#has_key?‎</code> و<code>Hash#value?‎</code> بدلًا من <code>Hash#has_value?‎</code>. فوفقًا لماتز (<code>Matz</code>)، تعدّ الأشكال الطويلة مُهملة.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_155" style=""><span class="com"># bad</span><span class="pln">
hash</span><span class="pun">.</span><span class="pln">has_key</span><span class="pun">?(:</span><span class="pln">test</span><span class="pun">)</span><span class="pln">
hash</span><span class="pun">.</span><span class="pln">has_value</span><span class="pun">?(</span><span class="pln">value</span><span class="pun">)</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
hash</span><span class="pun">.</span><span class="pln">key</span><span class="pun">?(:</span><span class="pln">test</span><span class="pun">)</span><span class="pln">
hash</span><span class="pun">.</span><span class="pln">value</span><span class="pun">?(</span><span class="pln">value</span><span class="pun">)</span></pre>

<ul>
	<li>
		<p>
			استخدم جدول <code>hash</code> متعدّد الأسطر لأنه يجعل الشيفرة أكثر قابليّة للقراءة، واستخدم الفواصل التذييلية للتأكد من أن أي تغيّر للوسطاء لن يتسبب بتغيّرات غريبة لشكل هذه الأسطر، وذلك عندما لا يتغيّر منطق الحلّ.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_159" style=""><span class="pln">hash </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">:</span><span class="pln">protocol </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'https'</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">:</span><span class="pln">only_path </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">:</span><span class="pln">controller </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">:</span><span class="pln">users</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">:</span><span class="pln">action </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">:</span><span class="pln">set_password</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">:</span><span class="pln">redirect </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">@redirect_url</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">:</span><span class="pln">secret </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">@secret</span><span class="pun">,</span><span class="pln">
</span><span class="pun">}</span></pre>

<ul>
	<li>
		<p>
			استخدم الفاصلة التذيليّة في المصفوفة الّتي تمتد لأكثر من سطر واحد.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_157" style=""><span class="com"># good</span><span class="pln">
array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">]</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="str">"car"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"bear"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"plane"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"zoo"</span><span class="pun">,</span><span class="pln">
</span><span class="pun">]</span></pre>

<h2 id="السلاسل_النصية">
	السلاسل النصية
</h2>

<ul>
	<li>
		<p>
			يُفضّل توليد السلسلة النصية (<code>string interpolation</code>) بدلًا من دمج السِلاسل النصية:
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_161" style=""><span class="com"># bad</span><span class="pln">
email_with_name </span><span class="pun">=</span><span class="pln"> user</span><span class="pun">.</span><span class="pln">name </span><span class="pun">+</span><span class="pln"> </span><span class="str">' &lt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> user</span><span class="pun">.</span><span class="pln">email </span><span class="pun">+</span><span class="pln"> </span><span class="str">'&gt;'</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
email_with_name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"#{user.name} &lt;#{user.email}&gt;"</span></pre>

<p>
	وعلاوة على ذلك، لا تنس توليد نمط روبي 1.9، لنفترض أنك تُنشئ مفاتيح ذاكرة التخزين المؤقت كالتالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_163" style=""><span class="pln">CACHE_KEY </span><span class="pun">=</span><span class="pln"> </span><span class="str">'_store'</span><span class="pln">

cache</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="lit">@user</span><span class="pun">.</span><span class="pln">id </span><span class="pun">+</span><span class="pln"> CACHE_KEY</span><span class="pun">)</span></pre>

<p>
	مرةً أخرى يُفضّل توليد السلسلة النصية (<code>string interpolation</code>) بدلًا من دمج السِلاسل النصية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_165" style=""><span class="pln">CACHE_KEY </span><span class="pun">=</span><span class="pln"> </span><span class="str">'%d_store'</span><span class="pln">

cache</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">CACHE_KEY </span><span class="pun">%</span><span class="pln"> </span><span class="lit">@user</span><span class="pun">.</span><span class="pln">id</span><span class="pun">)</span></pre>

<ul>
	<li>
		<p>
			تجنب استخدام <code>String#+‎</code> عندما تحتاج لإنشاء قطع بيانات كبيرة، واستخدم بدلًا من ذلك <code>String#&lt;&lt;‎</code>. تحور عملية دمج نسخ السلاسل النصية في مكانها، وهي أسرع دومًا من <code>String#+‎</code>، والّذي ينشئ مجموعة جديدة من كائنات السلسلة النصية.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_167" style=""><span class="com"># good and also fast</span><span class="pln">
story </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
story </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="str">'The Ugly Duckling'</span><span class="pln">

paragraphs</span><span class="pun">.</span><span class="pln">each </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">paragraph</span><span class="pun">|</span><span class="pln">
  story </span><span class="pun">&lt;&lt;</span><span class="pln"> paragraph
</span><span class="kwd">end</span></pre>

<ul>
	<li>
		<p>
			استخدم <code>\</code> في نهاية السطر بدلًا من <code>+</code> أو <code>&lt;&lt;</code> لدمج السلاسل النصية متعددة الأسطر.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_169" style=""><span class="com"># bad</span><span class="pln">
</span><span class="str">"Some string is really long and "</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
  </span><span class="str">"spans multiple lines."</span><span class="pln">

</span><span class="str">"Some string is really long and "</span><span class="pln"> </span><span class="pun">&lt;&lt;</span><span class="pln">
  </span><span class="str">"spans multiple lines."</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="str">"Some string is really long and "</span><span class="pln"> \
  </span><span class="str">"spans multiple lines."</span></pre>

<h2 id="التعابير_النمطية">
	التعابير النمطية
</h2>

<ul>
	<li>
		<p>
			تجنب استخدام <code>‎$1-9</code> لأنه من الصعب متابعة ما يحتويه، واستخدم بدلًا منه المجموعات المسماة (Named groups).
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_171" style=""><span class="com"># bad</span><span class="pln">
</span><span class="pun">/(</span><span class="pln">regexp</span><span class="pun">)/</span><span class="pln"> </span><span class="pun">=~</span><span class="pln"> string
</span><span class="pun">...</span><span class="pln">
process $1

</span><span class="com"># good</span><span class="pln">
</span><span class="pun">/(?&lt;</span><span class="pln">meaningful_var</span><span class="pun">&gt;</span><span class="pln">regexp</span><span class="pun">)/</span><span class="pln"> </span><span class="pun">=~</span><span class="pln"> string
</span><span class="pun">...</span><span class="pln">
process meaningful_var</span></pre>

<ul>
	<li>
		<p>
			كن حذرًا عند استخدام <code>^</code> و<code>$</code> لأنها تطابق بداية/نهاية السطر، وليس نهايات السلسلة النصية، فإذا أردت مطابقة كامل السلسلة النصية فاستخدم: <code>‎\A</code> و<code>‎\z</code>.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_174" style=""><span class="pln">string </span><span class="pun">=</span><span class="pln"> </span><span class="str">"some injection\nusername"</span><span class="pln">
string</span><span class="pun">[</span><span class="str">/^username$/</span><span class="pun">]</span><span class="pln">   </span><span class="com"># matches</span><span class="pln">
string</span><span class="pun">[</span><span class="str">/\Ausername\z/</span><span class="pun">]</span><span class="pln"> </span><span class="com"># don't match</span></pre>

<ul>
	<li>
		<p>
			استخدم المُعدّل <code>x</code> للتعابير النمطية المعقدة، فهذا سيجعلها أكثر قابلية للقراءة، ويمكنك إضافة بعض التعليقات المفيدة، فقط كن حذرًا لأنه سيتجاهل المسافات.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_176" style=""><span class="pln">regexp </span><span class="pun">=</span><span class="pln"> </span><span class="pun">%</span><span class="pln">r</span><span class="pun">{</span><span class="pln">
  start         </span><span class="com"># some text</span><span class="pln">
  \s            </span><span class="com"># white space char</span><span class="pln">
  </span><span class="pun">(</span><span class="pln">group</span><span class="pun">)</span><span class="pln">       </span><span class="com"># first group</span><span class="pln">
  </span><span class="pun">(?:</span><span class="pln">alt1</span><span class="pun">|</span><span class="pln">alt2</span><span class="pun">)</span><span class="pln"> </span><span class="com"># some alternation</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">
</span><span class="pun">}</span><span class="pln">x</span></pre>

<h2 id="محارف_النسبة_المئوية">
	محارف النسبة المئوية
</h2>

<ul>
	<li>
		<p>
			يفضل استخدام الأقواس الهلالية على الأقواس المعقوصة، أو الأقواس المعقوفة، أو حتى الأنابيب (<code>pipes</code>) عند استخدام محددات مجردة <code>%</code> للتناسق ولأن سلوك محارف <code>%</code> أقرب إلى استدعاء الدالّة منه إلى البدائل.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_178" style=""><span class="com"># bad</span><span class="pln">
</span><span class="pun">%</span><span class="pln">w</span><span class="pun">[</span><span class="pln">date locale</span><span class="pun">]</span><span class="pln">
</span><span class="pun">%</span><span class="pln">w</span><span class="pun">{</span><span class="pln">date locale</span><span class="pun">}</span><span class="pln">
</span><span class="pun">%</span><span class="pln">w</span><span class="pun">|</span><span class="pln">date locale</span><span class="pun">|</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="pun">%</span><span class="pln">w</span><span class="pun">(</span><span class="pln">date locale</span><span class="pun">)</span></pre>

<ul>
	<li>
		<p>
			استخدم <code>‎%w</code> كما يحلو لك.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_180" style=""><span class="pln">STATES </span><span class="pun">=</span><span class="pln"> </span><span class="pun">%</span><span class="pln">w</span><span class="pun">(</span><span class="pln">draft open closed</span><span class="pun">)</span></pre>

<ul>
	<li>
		<p>
			استخدم <code>()‎%</code> للسلاسل النصية المتكونة من سطر واحد، والّتي تتطلّب عملية توليد سلسلة وعلامات الاقتباس المزدوجة المضمّنة، وبالنسبة للسلاسل النصية المتكونة من عدة أسطر، يُفضل استخدام <code>heredocs</code>.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_182" style=""><span class="com"># bad - no interpolation needed</span><span class="pln">
</span><span class="pun">%(</span><span class="typ">Welcome</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Jane</span><span class="pun">!)</span><span class="pln">
</span><span class="com"># should be 'Welcome, Jane!'</span><span class="pln">

</span><span class="com"># bad - no double-quotes</span><span class="pln">
</span><span class="pun">%(</span><span class="typ">This</span><span class="pln"> is </span><span class="com">#{quality} style)</span><span class="pln">
</span><span class="com"># should be "This is #{quality} style"</span><span class="pln">

</span><span class="com"># bad - multiple lines</span><span class="pln">
</span><span class="pun">%(</span><span class="typ">Welcome</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Jane</span><span class="pun">!</span><span class="pln">\n</span><span class="typ">Please</span><span class="pln"> enjoy your stay at </span><span class="com">#{location}\nCheers!)</span><span class="pln">
</span><span class="com"># should be a heredoc.</span><span class="pln">

</span><span class="com"># good - requires interpolation, has quotes, single line</span><span class="pln">
</span><span class="pun">%(</span><span class="typ">Welcome</span><span class="pun">,</span><span class="pln"> </span><span class="com">#{name}!)</span></pre>

<ul>
	<li>
		<p>
			استخدم <code>‎٪r</code> للتعابير النمطية فقط والّتي تتطابق مع أكثر من محرف <code>/</code>.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_184" style=""><span class="com"># bad</span><span class="pln">
</span><span class="pun">%</span><span class="pln">r</span><span class="pun">(</span><span class="pln">\s</span><span class="pun">+)</span><span class="pln">

</span><span class="com"># still bad</span><span class="pln">
</span><span class="pun">%</span><span class="pln">r</span><span class="pun">(^/(.*)</span><span class="pln">$</span><span class="pun">)</span><span class="pln">
</span><span class="com"># should be /^\/(.*)$/</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="pun">%</span><span class="pln">r</span><span class="pun">(^</span><span class="str">/blog/</span><span class="lit">2011</span><span class="pun">/(.*)</span><span class="pln">$</span><span class="pun">)</span></pre>

<ul>
	<li>
		<p>
			تجنب استخدام <code>‎%x</code> إلا إذا أردت استدعاء أمر مع علامة الاقتباس الخلفية (`) - وهو أمر مستبعد إلى حد ما -.
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_186" style=""><span class="com"># bad</span><span class="pln">
date </span><span class="pun">=</span><span class="pln"> </span><span class="pun">%</span><span class="pln">x</span><span class="pun">(</span><span class="pln">date</span><span class="pun">)</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
date </span><span class="pun">=</span><span class="pln"> </span><span class="str">`date`</span><span class="pln">
echo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">%</span><span class="pln">x</span><span class="pun">(</span><span class="pln">echo </span><span class="str">`date`</span><span class="pun">)</span></pre>

<h2 id="ريلز">
	ريلز
</h2>

<p>
	عند العودة فورًا بعد استدعاء <code>render</code> أو <code>redirect_to</code>، ضع الكلمة المفتاحية <code>return</code> في السطر التالي وليس في نفس السطر.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_188" style=""><span class="com"># bad</span><span class="pln">
render </span><span class="pun">:</span><span class="pln">text </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Howdy'</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> </span><span class="kwd">return</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
render </span><span class="pun">:</span><span class="pln">text </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Howdy'</span><span class="pln">
</span><span class="kwd">return</span><span class="pln">

</span><span class="com"># still bad</span><span class="pln">
render </span><span class="pun">:</span><span class="pln">text </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Howdy'</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> foo</span><span class="pun">.</span><span class="pln">present</span><span class="pun">?</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> foo</span><span class="pun">.</span><span class="pln">present</span><span class="pun">?</span><span class="pln">
  render </span><span class="pun">:</span><span class="pln">text </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Howdy'</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">
</span></pre>

<h3 id="نطاقات">
	نطاقات
</h3>

<ul>
	<li>
		<p>
			عند تعريف نطاقات نموذج السجل الفعّال (ActiveRecord)، أحِط العلاقة بـ <code>lambda</code>، وخلافًا لذلك سيفرض الاتصال المجردة لقاعدة البيانات تنفيذه في وقت تحميل الصنف (مشابهة لطريقة بدء التشغيل).
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_441_190" style=""><span class="com"># bad</span><span class="pln">
scope </span><span class="pun">:</span><span class="pln">foo</span><span class="pun">,</span><span class="pln"> where</span><span class="pun">(:</span><span class="pln">bar </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">

</span><span class="com"># good</span><span class="pln">
scope </span><span class="pun">:</span><span class="pln">foo</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> where</span><span class="pun">(:</span><span class="pln">bar </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">}</span></pre>

<h2 id="انسجم_مع_الشيفرة">
	انسجم مع الشيفرة
</h2>

<p>
	إذا كنت تعدل شيفرة برمجية ما، فألقِ نظرة عليها لعدة دقائق، وحدّد أسلوب تنسيقها، فإن كانوا يستخدمون مسافات حول جميع المعاملات الرياضية، فانسجم مع هذه الطريقة، وإن كان للتعليقات صناديق صغيرة من المربعات <code>hash</code> حولها، فانسجم معها أيضًا.
</p>

<p>
	الهدف من امتلاك مبادئ توجيهية لتنسيق الشيفرة هي الحصول على مفردات مشتركة من الشيفرات ليتمكن الناس من فهم ما تقوله بدلًا من كيف تقوله، واستعرضنا هنا قواعد التنسيق العالمية حتى يعرف الناس المفردات، لكن التنسيقات شيفراتك المحلية مهمة أيضًا، فإذا كانت الشيفرة البرمجية الّتي ستضيفها تختلف اختلافًا كبيرًا عن الشيفرات البرمجية الّتي حولها فعندها ستجعل قراءة الشيفرة صعبة ولذلك تجنب هذا الأمر - <a href="https://google.github.io/styleguide/cppguide.html" rel="external nofollow">دليل Google لتنسيق الشيفرة البرمجية للغة C++‎</a>
</p>

<p>
	ترجمة لدليل <a href="https://github.com/airbnb/ruby" rel="external nofollow">Ruby Style Guide</a> من شركة Airbnb على موقع GitHub.
</p>
]]></description><guid isPermaLink="false">886</guid><pubDate>Sun, 07 Jun 2020 18:06:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x651;&#x641; &#x639;&#x644;&#x649; &#x644;&#x63A;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; Ruby</title><link>https://academy.hsoub.com/programming/ruby/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-ruby-r636/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_05/5af00d709456a_Ruby--.png.526a953d681bb78653eb69e38c687bfc.png" /></p>
<p style="text-align: center;">
	<iframe allow="autoplay; encrypted-media" allowfullscreen="" frameborder="0" height="394" src="https://academy.hsoub.com/applications/core/interface/index.html" width="700" data-embed-src="https://www.youtube.com/embed/8gjN-ZoATfo?rel=0"></iframe>
</p>

<p>
	الكثير من الناس يسمع عن لغات البرمجة ومدى رواجها في عالم الأعمال. وأصبح هناك توجه كبير نحو تعلّمها، وأصبحت لغات البرمجة هي لغات المستقبل والبرمجة مهنة المستقبل، وهنا السؤال الذي يتبادر إلى الأذهان ما هي اللغة التي يجب الانطلاق منها؟ سأكون معكم اليوم لأجيب عن هذا السؤال. وسوف أتحدث عن لغة البرمجة روبي وما الذي يجعلها خيارا مناسبًا لتبدأ به.
</p>

<p>
	تمتلك لغة روبي مجتمعاً كبيراً، وتكمن أهمية المجتمع الكبير بتوفيره الدعم الأفضل للمبرمجين سواء على مستوى المصادر والتوثيقات أو على مستوى المكتبات البرمجية المساعدة، فهي تملك مجتمعًا ناضجًا ومستقرًا.
</p>

<p>
	وتحظى لغة روبي بشعبية كبيرة في مجال تطوير الويب بشكلٍ خاص، فباستخدام إطار العمل Ruby on Rails يمكن للمطور البدء في بناء هيكلية الموقع وتنفيذ فكرته ورؤية النتائج عبر بضع أوامر، حيث أحدثَ إطار العمل Rails نقلة نوعية في مفاهيم وتطبيقات الويب، هذه المفاهيم تم تبنيها من قبل أُطر عمل أخرى لتصبح ركيزة لتطبيقات الويب الحديثة، لذا فالعديد من الشركات الناشئة ورواد الاعمال والمستقلين على حدٍ سواء يستخدمونها في بناء مشاريعهم. ويوفر إطار العمل RoR الكثير من الأدوات التي تجعل من تطوير تطبيقات الويب أمرًا منظما ويسيرًا. ويقدم إطار العمل Rails العديد من الحلول التي من شأنها تعزيز العمل المشترك بين المطورين وتقديم الأفكار والأدوات اللازمة لبناء تطبيقات ويب قابلة للتوسع والتطوير في المستقبل.
</p>
]]></description><guid isPermaLink="false">636</guid><pubDate>Mon, 07 May 2018 08:44:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x623;&#x635;&#x646;&#x627;&#x641; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; Ruby</title><link>https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-ruby-r628/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_02/5a957604c26aa_28(2).png.ecbe1db7f4e260a5bd019ed38e3d55c9.png" /></p>

<p>
	تستخدم الأصناف في البرمجة الغرضية التوجيه من أجل إنشاء الأغراض، وإعطاء القيم الابتدائية للمتغيرات المستنسخة. لكل صنف اسم خاص يعبر عن نوعه ووظيفته.
</p>

<h2>
	<a id="__2" rel=""></a>تعريف الأصناف
</h2>

<p>
	جميع الأصناف في Ruby مستنسخة من الصنف الرئيسي Class، حيث يتم تعريف الأصناف في لغة Ruby كما يلي:
</p>

<ul>
<li>
		يبدأ الصنف بالكلمة الدلالية <code>class</code> وبعدها يكتب اسم الصنف.
	</li>
	<li>
		يجب أن يبدأ اسم الصنف بحرف كبير. وفي حال كان اسم الصنف مكون من عدة كلمات، يتم تمييز هذه الكلمات بكتابة أول حرف من كل كلمة بالنمط الكبير وباقي الأحرف صغيرة، كونه لا يمكن استخدام فراغات فاصلة بين الكلمات في أسماء الأصناف.
	</li>
	<li>
		يمكن أن يحتوي الصنف على متغير الصنف، والمتغير المستنسخ، ودالة الصنف، بالإضافة لإمكانية استدعاء الدوال الأخرى مثل الدالة <code>attr_accessor</code> (دوال الولوج).
	</li>
	<li>
		ينتهي الصنف بالكلمة الدلالية <code>end</code>.<br>
		يوضح المثالي التالي طريقة تعريف الأصناف:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">SampleClass</span><span class="pln">
   </span><span class="com"># some code describing the class behavior  </span><span class="pln">
      </span><span class="kwd">def</span><span class="pln"> sample_method
   </span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span></pre>

<h2>
	<a id="_16" rel=""></a>الاستنساخ
</h2>

<p>
	يتم إنشاء الأغراض من الأصناف بعملية تسمى الاستنساخ، حيث يصبح الغرض عبارة عن نسخة من الصنف الذي تم استنساخه عنه. تنفذ عملية الاستنساخ باستخدام الدالة <code>new</code> مع اسم الصنف المراد إنشاء الغرض منه كما هو موضح بالمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>std1 = Student.new(parameters)
</code></pre>

<h2>
	<a id="__21" rel=""></a>المتغيرات المستنسخة
</h2>

<p>
	وهي المتغيرات التي يتم تعريفها ضمن دوال الأصناف بإضافة الرمز <code>@</code> لبداية اسم المتغير. وينحصر نطاقها فقط على الغرض المُنشأ من الصنف، ولا يمكن الولوج إليها وإظهار قيمها أو تعديلها إلاّ من خلال الدالة التي عُرّفت فيها (دوال الولوج). سيتم توضيح هذه المتغيرات من خلال المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class Calculation
   @x = 100
   def add_num
      @x = 200
   end
   def show_data
      puts 'Value of x is : '، @x
   end
end

instance = Calculation.new
instance.show_data
instance.add_num
instance.show_data
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>Value of x is :

Value of x is :
200
</code></pre>

<p>
	نلاحظ أن الخرج الأول الدالة <code>show_data</code> من الغرض <code>instance</code> والمُنشأ من الصنف <code>Calculation</code> فارغ، لأن قيمة المتغير المستنسخ <code>@x</code> مازالت <code>nil</code> (لا شيء) بالرغم من أنه تم إسناد القيمة <code>100</code> لهذا المتغير في بداية تعريف الصنف <code>Calculation</code>، وذلك لأن طريقة التعريف هذه خاطئة للمتغير المستنسخ <code>@x</code>، حيث يجب أن يتم تعريفه ضمن دوال الصنف فقط، بالتالي تم تجاهل هذا التعريف. أما الخرج الثاني لهذه الدالة أصبح <code>200</code> لأنه تم تنفيذ الدالة <code>add_num</code> (التي عُرّف فيها) من الغرض <code>instance</code> والتي قامت بتهيئة المتغير المستنسخ <code>@x</code> بالقيمة <code>200</code>.
</p>

<h2>
	<a id="__50" rel=""></a>دوال الولوج
</h2>

<p>
	وهي دوال الصنف التي تعرَّف ضمنها المتغيرات المستنسخة، حيث تُستخدم هذه الدال من أجل الولوج إلى المتغيرات المستنسخة للأغراض من أجل قراءة قيمها أو تعديلها. يوضح المثال التالي هذه الدوال:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_9" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyData</span><span class="pln">
       </span><span class="kwd">def</span><span class="pln"> set_data</span><span class="pun">(</span><span class="pln">n</span><span class="pun">)</span><span class="pln"> 
        </span><span class="lit">@x</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> n
        </span><span class="kwd">end</span><span class="pln">
       </span><span class="kwd">def</span><span class="pln"> get_data 
          </span><span class="lit">@x</span><span class="pln">
        </span><span class="kwd">end</span><span class="pln">
     </span><span class="kwd">end</span><span class="pln">

    d </span><span class="pun">=</span><span class="pln">  </span><span class="typ">MyData</span><span class="pun">.</span><span class="pln">new
    puts d</span><span class="pun">.</span><span class="pln">set_data</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">)</span><span class="pln">
    puts d</span><span class="pun">.</span><span class="pln">get_data   </span></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>1000
1000
</code></pre>

<p>
	حيث يحتوي الصنف <code>MyData</code> على دالتي ولوج هما: الدالة <code>set_data</code> لتعديل قيمة المتغير المستنسخ <code>@x</code>، والدالة <code>get_data</code> لقراءة قيمة هذا المتغير المستنسخ.
</p>

<h2>
	<a id="__72" rel=""></a>متغيرات الأصناف
</h2>

<p>
	وهي المتغيرات المعرفة في بداية الصنف بإضافة الرمز <code>@@</code> لبداية اسم المتغير، حيث يتم مشاركة قيمها مع جميع الأغراض المُنشأة من هذا الصنف وكذلك مع جميع الأصناف المورَّثة من هذا الصنف، على عكس المتغيرات المستنسخة التي لا يتم مشاركة قيمها بين الأغراض. والمثال التالي يوضح هذه المتغيرات:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class MyData
   @@x = 1
   def add_n
      @@x =  @@x + 10
   end
   def value
      @@x
   end
end
  
ins1 = MyData.new
ins2 = MyData.new
puts ins1.value
ins1.add_n
puts ins1.value
puts ins2.value
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>1
11
11
</code></pre>

<h2>
	<a id="___98" rel=""></a>المتغيرات المستنسخة للأصناف
</h2>

<p>
	تختلف هذه المتغيرات عن متغيرات الأصناف، بأنه يتم مشاركة قيمها مع الأغراض المُنشأة من هذا الصنف فقط، كما هو موضح بالمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_11" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Employee</span><span class="pln">
    </span><span class="kwd">class</span><span class="pln"> </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">;</span><span class="pln"> attr_accessor </span><span class="pun">:</span><span class="pln">instances</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> store
      </span><span class="kwd">self</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">.</span><span class="pln">instances </span><span class="pun">||=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
      </span><span class="kwd">self</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">.</span><span class="pln">instances </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="kwd">self</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> initialize name
      </span><span class="lit">@name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> name
    </span><span class="kwd">end</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">
  </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Overhead</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">end</span><span class="pln">
  </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Programmer</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">end</span><span class="pln">
  </span><span class="typ">Overhead</span><span class="pun">.</span><span class="pln">new</span><span class="pun">(</span><span class="str">'Martin'</span><span class="pun">).</span><span class="pln">store
  </span><span class="typ">Overhead</span><span class="pun">.</span><span class="pln">new</span><span class="pun">(</span><span class="str">'Roy'</span><span class="pun">).</span><span class="pln">store
  </span><span class="typ">Programmer</span><span class="pun">.</span><span class="pln">new</span><span class="pun">(</span><span class="str">'Erik'</span><span class="pun">).</span><span class="pln">store
  puts </span><span class="typ">Overhead</span><span class="pun">.</span><span class="pln">instances</span><span class="pun">.</span><span class="pln">size    </span><span class="com"># =&gt; 2</span><span class="pln">
  puts </span><span class="typ">Programmer</span><span class="pun">.</span><span class="pln">instances</span><span class="pun">.</span><span class="pln">size  </span><span class="com"># =&gt; 1</span></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>2
1
</code></pre>

<h2>
	<a id="__124" rel=""></a>دوال الأصناف
</h2>

<p>
	يتم تعريف دوال الأصناف بنفس طريقة تعريف دوال Ruby الاعتيادية باختلاف وحيد، وهو إضافة اسم الصنف أو الكلمة الدلالية <code>self</code> وبعدها نقطة قبل اسم الدالة. يتم استدعاء دوال الأصناف على مستوى الصنف الذي عرفت فيه دون الحاجة لوجود غرض مُنشأ من هذا الصنف. كما يمكن لدوال الأصناف الولوج إلى متغيرات الأصناف لكنها لا تستطيع الولوج إلى المتغيرات المستنسخة (فقط دول الولوج تستطيع ذلك). يوضح المثال التالي كيفية تعريف واستدعاء دوال الأصناف:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_13" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Student</span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">no_students
      puts </span><span class="str">'There are five hundred students in my school.'</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">
  </span><span class="kwd">end</span><span class="pln">
  </span><span class="typ">Student</span><span class="pun">.</span><span class="pln">no_students</span></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>There are five hundred students in my school.
</code></pre>

<h2>
	<a id="____139" rel=""></a>مستويات الوصول لدوال الأصناف
</h2>

<p>
	هنالك ثلاث مستويات للوصول إلى دوال الأصناف هي:
</p>

<ul>
<li>
		<strong>الدوال العامة:</strong> إن دوال الأصناف في Ruby هي دوال عامة بشكل افتراضي، أي يمكن لأي أحد الوصول إليها، وتشكل واجهة التخاطب للأصناف، حيث يتم من خلالها تبادل المعطيات بين الصنف والعالم الخارجي.
	</li>
	<li>
		<strong>الدوال الخاصة:</strong> يتم تحديدها بالكلمة الدلالية <code>private</code>، وهي للاستخدام الداخلي فقط ضمن الصنف (يمكن استدعائها خارجياً عن طريق دالة عامة تحوي على هذه الدالة الخاصة مثل <code>whisper_louder</code>)، حيث يمكن الوصول إليها واستخدامها فقط من قبل الدوال الموجودة ضمن تعريف الصنف نفسه أو الأصناف المورَّثة منه، بشرط أن يكون استدعائها صريح (مثل <code>whisper</code>) دون أن تكون مضمّنة في غرض آخر حتى ولو كان من نفس الصنف (مثل <code>self.whisper</code>). عند الرغبة باستدعاء هذه الدوال خارج الصنف عن طريق استدعائها بشكل مضمّن في الدوال العامة كما هو موضح بالمثال التالي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class Person
   def speak
      puts "Hey، Tj!"
   end
   def whisper_louder
      whisper
   end 
   def whisper_louder_with_self
      self.whisper
   end
# private methods are for internal usage within the defining class
   private 
   def whisper
      puts "His name's not really 'Tj'." 
   end 
end
a_hater = Person.new
a_hater.speak # استدعاء دالة عامة
a_hater.whisper # استدعاء دالة خاصة خارج الصنف
a_hater.whisper_louder # استدعاء دالة عامة تحوي على دالة خاصة صريحة
a_hater. whisper_louder_with_self 
#   استدعاء دالة عامة تحوي على دالة خاصة مضمنة
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>"Hey، Tj!"
NoMethodError
"His name's not really 'Tj'." 
NoMethodError
</code></pre>

<ul>
<li>
		<strong>الدوال المحمية:</strong> ويتم تحديدها بالكلمة الدلالية <code>protected</code>، وهي نفس الدوال الخاصة بفارق أساسي هو إمكانية استدعائها داخليا بشكل مضمّن في غرض من نفس الصنف كما هو موضح بالمثال التالي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class User
   def say_secret_with_self
      self.secret
   end
   protected
   def secret
      "secret"
   end
end

u = User.new
u.say_secret_with_self # =&gt; استدعاء دالة عامة تحوي على دالة محمية مضمنة 
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>"secret"
</code></pre>

<h2>
	<a id="____194" rel=""></a>دوال القراءة والكتابة الشخصية
</h2>

<p>
	تُنشأ المتغيرات المستنسخة لكل غرض مُنشأ من صنف، لتستخدم بشكل أساسي ضمن هذا الغرض، لكنها لا تشبه الدوال الخاصة من حيث اقتصارها على الاستخدام الداخلي. حيث يمكن إظهار وتعديل قيمها من خارج الغرض، وذلك عن طريق تعريف دوال القراءة والكتابة الشخصية (مشابه لدوال الولوج). يوضّح المثال التالي طريقة تعريف دالة القراءة (<code>student_name</code>) التي تقوم بقراءة قيمة المتغير المستنسخ:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class Student
   def initialize(student_name، id)
      @student_name = student_name
      @id = id
   end
   def student_name
      @student_name
   end
end

std1 = Student.new("Sara"، 5)
puts std1.student_name
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>Sara 
</code></pre>

<p>
	والمثال التالي يوضّح طريقة تعريف دالة الكتابة (<code>sname=</code>) والتي تقوم بتغيير قيمة المتغيّر المستنسخ:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class Student
   def initialize(sname)
      @sname = sname
   end
   def sname
      @sname
   end
   def sname=(new_name)
      @sname = new_name
      puts @sname
   end
end
  
# you could the access @sname variable as
a = Student.new('Sara')
puts a.sname 
a.sname ='Robin'
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>Sara
Robin
</code></pre>

<h2>
	<a id="____239" rel=""></a>دوال القراءة والكتابة الافتراضية
</h2>

<p>
	يمكن تنفيذ جميع وظائف قراءة وتعديل قيم المتغيرات المستنسخة عن طريق الدوال <code>attr_accessor</code> و <code>attr_reader</code> و <code>attr_writer</code> والموجودة في لغة Ruby بشكل افتراضي، حيث تستخدم الدالة <code>attr_accessor</code> لتنفيذ عمليتي القراءة والكتابة معًا في هذه المتغيرات كما هو موضح بالمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class Student
   def initialize(sname)
      @sname = sname
   end
       attr_accessor :sname
end
  
# attr_accessor generates variable @sname accessor methods automatically:
a = Student.new('Sara')
puts a.sname 
a.sname = 'Robin'
puts a.sname 
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>Sara
Robin
</code></pre>

<p>
	أما الدالة <code>attr_reader</code> فتستخدم لتنفيذ عملية القراء فقط، والدالة <code>attr_writer</code> فتستخدم لتنفيذ عملية الكتابة فقط كما هو موضّح بالمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class Student
   attr_reader :sname
   attr_writer :sname
end

s1 = Student.new
s2 = Student.new
s1.sname = "Sara"
s2.sname = "Robin"

puts s1.sname
puts s2.sname
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>Sara
Robin
</code></pre>

<h2>
	<a id="___Ruby_281" rel=""></a>ثوابت أصناف لغة Ruby
</h2>

<p>
	يمكن أن تعرّف الثوابت ضمن الأصناف، لكن يمكن الولوج إليها من خارج الأصناف على خلاف المتغيرات المستنسخة التي تحتاج لدوال خاصة لتنفيذ ذلك، ويوضح المثال التالي طريقة تعريف الثوابت ضمن الأصناف، واستخدامها داخل وخارج الأصناف:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class ConstClass
   Color1='Red'
   Color2='Green'
   Color3='White'
   def show
      puts "#{Color1} #{Color2} #{Color3}"
   end
end
   
puts( ConstClass::Color1)
ConstClass.new.show
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>Red
Red Green White
</code></pre>

<h2>
	<a id="_301" rel=""></a>الوراثة
</h2>

<p>
	وهي العلاقة بين صنفين، حيث يمكن لصنف أن يرث الوظائف والمتغيرات من صنف أعلى منه مرتبة، ويسمى عندها الصنف الموروث بصنف الأب أو الصنف الأساس، ويسمى الصنف الوارث بصنف الابن، هذا ولا تسمح Ruby بالوراثة المتعددة، أي لكل صنف في Ruby صنف أساس واحد. يوضح المثال التالي طريقة توريث جميع الوظائف والمتغيرات الغير خاصة لصنف آخر (صنف الابن):
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class Student
   def schooldetails
      puts 'There are 700 students in our school.'
   end
end
class Classfive &lt;  Student  # &lt; means inherit
   def class5
      puts 'There are 75 students in Class V.'
   end
end

instance = Classfive.new
instance.class5
instance.schooldetails
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>There are 75 students in Class V.
There are 700 students in our school.
</code></pre>

<p>
	حيث تم في هذا المثال توريث الصنف Classfive من الصنف Student.<br>
	يستطيع الصنف الابن الولوج إلى دوال الصنف الأب، عن طريق الكلمة الدلالية <code>super</code>، كما هو موضّح بالمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class Student
   def schooldetails
      puts 'There are 700 students in our school.'
   end
end
class Classfive &lt;  Student  # &lt; means inherit
   def schooldetails
      super      
      puts 'There are 75 students in Class V.'
   end
end
instance = Classfive.new
instance.schooldetails 
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>There are 700 students in our school.
There are 75 students in Class V.
</code></pre>

<p>
	يمكن في الوراثة المتعددة الولوج إلى دوال الصنف الأب باستخدام أسماء بديلة عن طريق الدالة <code>alias</code>، كما هو موضّح بالمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class V
   def ccccc
      "Class V "
   end
end
class VI  &lt; V
   alias vcv ccccc
   def ccccc
      vcv + "VI "
   end
end
class VII &lt;  VI
   def ccccc
      vcv + "VII "
   end
end
puts V.new.ccccc
puts VI.new.ccccc
puts VII.new.ccccc
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>Class V
Class V VI
Class V VII
</code></pre>

<p>
	حيث تم استخدام الاسم <code>vcv</code> كبدل لاسم الدالة <code>ccccc</code> المعرّفة في الصنف <code>V</code>، ثم تم استخدام هذا الاسم البديل في الأصناف الوارثة كون اسم دوالها هو نفس الاسم الأصلي لدالة الصنف <code>V</code>.
</p>

<h2>
	<a id="__375" rel=""></a>الأصناف الفريدة
</h2>

<p>
	تحتوي لغة Ruby على طريقة لتعريف دوال محددة من أجل غرض معين، حيث تسمى هذه الدوال بالدوال الفريدة. فعند القيام بتعريف دوال فريدة في غرض ما، فإن لغة Ruby تقوم تلقائياً بإنشاء صنف جديد لاحتواء هذه الدوال الفريدة فقط، والذي يسمى عندها بالصنف الفريد. ويفيد هذا الصنف عند الرغبة باستدعاء دواله في أقسام مختلفة من التطبيق البرمجي، مثل تأمين الاتصال مع النظام الخارجي أو الولوج لقاعدة البيانات أو غيرها. ويوضح المثال التالي هذه الأصناف:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>tutorial1 = String.new
def tutorial1.size
   "Learn Ruby"
End

tutorial2 = String.new  
puts tutorial1.singleton_methods
puts  tutorial2.singleton_methods
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>Learn Ruby
String
0
</code></pre>

<p>
	حيث تم استخدام الدالة <code>singleton_method</code> للحصول على قائمة أسماء جميع الدوال الفريدة الموجودة في الغرض.هذا ويمكن الولوج إلى صنف الغرض الفريد باستخدام الصيغة التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>class &lt;&lt; object
</code></pre>

<p>
	كما هو موضح بالمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>arra1 = [] 
class &lt;&lt; arra1 
   def foo 
      "Hello World!" 
   end
end 
puts arra1.singleton_methods
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2153_7" style="">
<code>foo
</code></pre>

<p>
	ترجمة –وبتصرّف- للمقال <a href="https://www.w3resource.com/ruby/ruby-classes.php" rel="external nofollow">Ruby Classes</a>
</p>

<p>
	حقوق خلفية الصورة البارزة محفوظة لـ <a href="http://all-free-download.com" ipsnoembed="true" rel="external nofollow">all-free-download.com</a>
</p>
]]></description><guid isPermaLink="false">628</guid><pubDate>Tue, 27 Feb 2018 15:16:46 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x62B;&#x628;&#x651;&#x62A; Ruby &#x639;&#x644;&#x649; &#x648;&#x64A;&#x646;&#x62F;&#x648;&#x632; 10</title><link>https://academy.hsoub.com/programming/ruby/%D9%83%D9%8A%D9%81-%D8%AA%D8%AB%D8%A8%D9%91%D8%AA-ruby-%D8%B9%D9%84%D9%89-%D9%88%D9%8A%D9%86%D8%AF%D9%88%D8%B2-10-r547/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_10/17-2.png.c50ce091343c5801cae313c606fac810.png" /></p>

<p>
	إنَّ لغة البرمجة Ruby هي إحدى لغات البرمجة الديناميكيِّة التي تُستخدم في أغلب مجالات البرمجة بدءًا من كتابة أكواد البرامج البسيطة وحتى الألعاب وتطبيقات الويب. كان أول إصدار لهذه اللغة عام 1993 في اليابان ولكنها لم تكتسب شهرتها حتى عام 2005 إذ استُخدمت على نطاقٍ واسعٍ في برمجة وتطوير الويب. بالرغم من أنَّها سهلة الاستخدام ومناسبة جدًا لحديثي العهد في مجال البرمجة إلا أنَّها قوية بما يكفي لإنشاء البرامج والأنظمة المعقَّدة. بعبارة أخرى، هذه اللغة هي أفضل خيار للمبتدئين والمحترفين في الوقت ذاته.<br>
	توجد طرائق عدَّة لتثبيت Ruby على نظام التشغيل ويندوز 10 إلَّا أنَّ مايكروسوفت تنصح باستخدام “نظام لينكس الفرعي في ويندوز” (Windows Subsystem for Linux)، ويدعى اختصارًا WSL، وهي إحدى مزايا ويندوز 10 التي تسمح للمطورين والمبرمجين بالعمل ضمن بيئة لينكس وتشغيل سطر الأوامر (bash) والاستفادة من أدواته وتطبيقاته المختلفة بينما هم في ويندوز ودون الحاجة للجوء إلى البيئة الافتراضيَّة (virtual machine).<br>
	بما أنَّ معظم المكتبات المتعلقة بهذه اللغة صُمِّمت للعمل ضمن بيئة لينكس فإنَّ تشغيلها على ويندوز يؤدي إلى حدوث الكثير من الأخطاء، لذا اشتركت مايكروسوفت مع Canonical وتوزيعات أخرى من لينكس في مشروع لتفعيل الصدفة (Shell) ودعم أدوات سطر أوامر لينكس على ويندوز الأمر الذي ساعد في حل المشكلات السابقة، ويمكن حينها تشغيل Ruby وجميع الأدوات والمكتبات المرتبطة بها على ويندوز دون أخطاء.<br>
	إن كان نظام التشغيل على حاسوبك هو ويندوز 10 مع إمكانيَّة استخدام صلاحيات المستخدم المسؤول كما ثبتَّ عليه مؤخرًا آخر التحديثات، وكنت تبحث عن طريقةٍ لتثبيت أحدث إصدار من Ruby وكل ما يتعلق بها فقد اخترت المقال المناسب ليرشدك لذلك.
</p>

<h2 id="الخطوة-الأولى-تثبيت-الصدفة-على-ويندوز">
	الخطوة الأولى: تثبيت الصدفة على ويندوز
</h2>

<p>
	تحتاج لتثبيت Ruby والعمل على هذه اللغة إلى استخدام سطر الأوامر؛ إن لم تسمع بهذا المصطلح من قبل فهذا يعني أنك حديث عهد بمجال البرمجة. سطر الأوامر هو بيئة غير رسوميَّة أي لا دور للفأرة والأيقونات فيها وبدلًا من ذلك تستطيع التحكم بالحاسوب وأداء المهام الروتينيَّة بكتابة مجموعة من الأوامر (نصوص) ضمن سطر الأوامر يفهمها الحاسوب لأداء مهمَّة ما ثمَّ تظهر لك النتيجة على شكل نص أيضًا؛ لا يستطيع مطورو البرامج الاستغناء عن سطر الأوامر فهو من الأدوات الأساسيَّة لديهم.<br>
	يحوي نظام التشغيل ويندوز على نوعين من سطر الأوامر وهما: موجه الأوامر (command prompt) والصدفة (powerShell)؛ قد يشبهان بعضهما ظاهريًا ولكنها يختلفان كثيرًا عمليًا إلى درجة انعدام التشابه؛ موجه الأوامر قديم جدًا فهو من مخلفات نظام التشغيل MS-DOS إذ لم يعد يلبي كافة الاحتياجات فأصبح محدودًا بينما ظهرت الصدفة (powerShell) مع ويندوز 7 لتوفر بيئة جديدة ومتطورة في ويندوز، وهي معقَّدة بعض الشيء ولكنَّها ذات كفاءة عالية جدًا.<br>
	سنثبِّت على ويندوز الصدفة ذات النوع (bash) وهي الأكثر شهرة والمتواجدة في نظامي التشغيل لينكس و macOS؛ للبدء بذلك يجب تفعيل “وضع المطور” (developer mode) -تأكد قبل ذلك أنَّ نظام التشغيل هو 64 بت- عبر الذهاب إلى خيار “التحديث والأمان” (Update &amp; Security) الموجود في الإعدادات (settings) ثمَّ اختيار “للمطورين” (For developers) الموجود ضمن القائمة الجانبيَّة وتفعيل خيار “وضع المطور” ثمَّ حفظ الإعدادات.<br>
	الخطوة التالية هي الذهاب إلى “لوحة التحكم” (control panel) ثم اختيار “البرامج” (programs) وبعدها اختيار “تشغيل ميزات ويندوز أو إيقاف تشغيلها” (Turn Windows features on or off) وتفعيل الخيار “Windows Subsystem For Linux (Beta)” من القائمة ثمَّ الضغط على “موافق” والانتظار حتى الانتهاء من تثبيت العناصر الإضافية؛ سيظهر بعد ذلك خيار يطالبك بإعادة تشغيل الحاسوب؛ بعد إعادة التشغيل، افتح موجه الأوامر واكتب ما يلي:
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
C:\Users\Sammy&gt; bash</pre>

<p>
	ستظهر لك رسالة تخبرك بالحاجة لتثبيت bash من متجر ويندوز لذا اضغط “y” لإتمام هذه العملية.
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs livecodeserver"><span class="typ">This</span><span class="pln"> will install </span><span class="typ">Ubuntu</span><span class="pln"> </span><span class="hljs-command"><span class="hljs-keyword"><span class="pln">on</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">Windows</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-title"><span class="pln">distributed</span></span><span class="pln"> </span><span class="hljs-title"><span class="kwd">by</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">Canonical</span></span></span><span class="pln">
</span><span class="hljs-operator"><span class="kwd">and</span></span><span class="pln"> licensed under its terms available here</span><span class="pun">:</span><span class="pln">
</span><span class="hljs-keyword"><span class="pln">https</span></span><span class="pun">:</span><span class="com">//aka.ms/uowterms</span><span class="pln">

</span><span class="typ">Press</span><span class="pln"> </span><span class="hljs-string"><span class="str">"y"</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">to</span></span><span class="pln"> </span><span class="kwd">continue</span><span class="pun">:</span><span class="pln"> y
</span><span class="typ">Downloading</span><span class="pln"> </span><span class="hljs-built_in"><span class="kwd">from</span></span><span class="pln"> </span><span class="hljs-operator"><span class="pln">the</span></span><span class="pln"> </span><span class="typ">Windows</span><span class="pln"> </span><span class="typ">Store</span><span class="pun">...</span><span class="pln"> </span><span class="hljs-number"><span class="lit">100</span></span><span class="pun">%</span><span class="pln">
</span><span class="typ">Extracting</span><span class="pln"> filesystem</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pln"> will take </span><span class="hljs-operator"><span class="pln">a</span></span><span class="pln"> few minutes</span><span class="pun">.…</span></code></pre>

<p>
	سيُطلب منك بعد إنهاء عملية التثبيت إنشاء مستخدم جديد.
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs oxygene"><span class="typ">Please</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">create</span></span><span class="pln"> a </span><span class="hljs-keyword"><span class="kwd">default</span></span><span class="pln"> UNIX user account</span><span class="pun">.</span><span class="pln"> </span><span class="typ">The</span><span class="pln"> username does </span><span class="hljs-keyword"><span class="kwd">not</span></span><span class="pln"> need </span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pln"> match your </span><span class="typ">Windows</span><span class="pln"> username</span><span class="pun">.</span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">For</span></span><span class="pln"> more information visit</span><span class="pun">:</span><span class="pln"> https</span><span class="pun">:</span><span class="hljs-comment"><span class="com">//aka.ms.wslusers</span></span><span class="pln">
</span><span class="typ">Enter</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pln"> UNIX username</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Sammy</span><span class="pln">
</span><span class="typ">Enter</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pln"> UNIX password</span><span class="pun">:</span></code></pre>

<p>
	أدخل اسم المستخدم وكلمة المرور؛ لا تقلق إذا لم يظهر أي شيء ضمن خيار إدخال كلمة المرور بينما أنت تضغط على المفاتيح إذ ذلك من دواعي الأمان وستعتاد عليه لاحقًا. ستعمل بعد ذلك الصدفة (bash) وسيظهر اسم المستخدم الذي أدخلته للتو ضمن المحث كما هو موضح.
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs ruby"><span class="pln">sammy</span><span class="hljs-variable"><span class="pln">@yourmachine</span></span><span class="hljs-symbol"><span class="pun">:</span><span class="str">/mnt/</span><span class="pln">c</span><span class="pun">/</span><span class="typ">Users</span><span class="pun">/</span><span class="typ">Sammy</span></span><span class="typ">$</span></code></pre>

<p>
	ملاحظة: تكون الملفات المتعلقة بنظام لينكس الفرعي في ويندوز WSL مخفية ولا يدعم ويندوز إمكانية الوصول إليها مطلقًا وقد تتلف هذه الملفات إن حاولت الوصول إليها باستخدام برنامج أو مدير ملفات أو غيرهما؛ خلافًا لذلك، من الممكن الوصول إلى الملفات الموجودة على النظام بوساطة الصدفة (bash) فمثلًا يمكن الوصول إلى محتويات القرص C بكتابة المسار ‎/mnt/c في سطر الأوامر.
</p>

<h2 id="الخطوة-الثانية-تثبيت-مدير-إصدارات-ruby-rvm">
	الخطوة الثانية: تثبيت مدير إصدارات Ruby‏ (RVM)
</h2>

<p>
	يعتبر مدير إصدارات Ruby‏ (Ruby Version Manager)، ويدعى اختصارًا RVM، بأنَّه المسؤول عن تثبيت لغة البرمجة Ruby وإعدادها، وإدارتها، وضبط البيئة البرمجية المرتبطة بها؛ ويعمل على نظام التشغيل لينكس و macOS.<br>
	نستخدم أولًا الأمر gpg لطلب الحصول على المفتاح العام المخصَّص لمشروع RVM من خادوم المفتاح العام (public key server) الذي يُستعمل لتوقيع جميع إصدارات RVM وذلك للتحقق من إصدار RVM الذي ننوي تنزيله.
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs brainfuck"><span class="hljs-comment"><span class="pln">$</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">gpg</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-comment"><span class="pln">keyserver</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">hkp</span><span class="pun">:</span><span class="com">//keys</span></span><span class="hljs-string"><span class="com">.</span></span><span class="hljs-comment"><span class="com">gnupg</span></span><span class="hljs-string"><span class="com">.</span></span><span class="hljs-comment"><span class="com">net</span></span><span class="com"> </span><span class="hljs-literal"><span class="com">-</span></span><span class="hljs-literal"><span class="com">-</span></span><span class="hljs-comment"><span class="com">recv</span></span><span class="hljs-literal"><span class="com">-</span></span><span class="hljs-comment"><span class="com">keys</span></span><span class="com"> </span><span class="hljs-comment"><span class="com">409B6B1796C275462A1703113804BB82D39DC0E3</span></span><span class="com"> </span><span class="hljs-comment"><span class="com">7D2BAF1CF37B13E2069D6956105BD0E739499BDB</span></span></code></pre>

<p>
	الخطوة التالية هي تثبيت الحزمة gnupg2 التي ستستخدمها أثناء تثبيت RVM للتحقق من الإصدار وذلك بكتابة الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs bash"><span class="pln">$ </span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> apt</span><span class="pun">-</span><span class="kwd">get</span><span class="pln"> install gnupg2</span></code></pre>

<p>
	سيظهر لك محث يطالبك بإدخال كلمة المرور؛ أدخل كلمة المرور المخصصة للمستخدم الذي أنشأته منذ قليل أثناء تثبيت الصدفة (bash). استخدم بعدها الأمر curl لتنزيل سكربت تثبيت RVM من موقعه.
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs avrasm"><span class="pln">$ \curl </span><span class="pun">-</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">sSL</abbr> https</span><span class="pun">:</span><span class="com">//get</span><span class="hljs-preprocessor"><span class="com">.rvm</span></span><span class="hljs-preprocessor"><span class="com">.io</span></span><span class="com"> -o rvm</span><span class="hljs-preprocessor"><span class="com">.sh</span></span></code></pre>

<p>
	يساعدنا الخط المائل العكسي الذي استخدمناه في بداية الأمر على التأكد من استخدام الإصدار المستقر من curl بدلًا من الإصدارات المعدَّلة؛ الخيارات التي استخدمناها مع الأمر السابق هي:
</p>

<ul>
<li>
		‎-s أو ‎–silent: يخفي نسبة اكتمال عملية التنزيل.
	</li>
	<li>
		-S أو ‎–show-error: يظهر رسالة بالخطأ إن فشلت عملية التنزيل.
	</li>
	<li>
		-L أو ‎–location: في حال تغيير موقع الصفحة المطلوبة إلى موقع آخر فإنَّ هذا الأمر يساعد في إعادة تنفيذ الأمر من جديد للموقع الجديد الذي<br>
		يرسله الخادم.
	</li>
</ul>
<p>
	يمكن التحقق من محتوى السكربت الذي نزلته من الموقع بفتحه عبر less وذلك بكتابة الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs ruby"><span class="hljs-variable"><span class="pln">$ </span></span><span class="pln">less rvm</span><span class="pun">.</span><span class="pln">sh</span></code></pre>

<p>
	بعد أن تطمئن من محتواه، اضغط “q” للخروج من المحرر والعودة إلى المحث ثمَّ شغل هذا السكربت لتنزيل أحدث إصدار من RVM عبر الأمر:
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs bash"><span class="pln">$ cat rvm</span><span class="pun">.</span><span class="pln">sh </span><span class="pun">|</span><span class="pln"> bash </span><span class="hljs-operator"><span class="pun">-</span><span class="pln">s</span></span><span class="pln"> stable</span></code></pre>

<p>
	سينشئ السكربت مجلدًا جديدًا باسم ‎.rvm في مجلد المنزل للمستخدم الذي أنشأته لوضع جميع ملفات Ruby و RVM وما يتعلق بهما؛ سيعدِّل أيضًا ملف البدء ‎.bashrc لإضافة المجلد ‎.rvm/bin إلى قائمة المجلدات التي ستبحث فيها الصدفة عند تنفيذ أحد الأوامر مما يعرِّف الصدفة على مكان الملفات التنفيذيَّة عند استخدام الأمر rvm بسهولة. على أي حال، إنَّ الملف ‎.bashrc لا يُقرأ إلَّا في بداية الجلسة لذا لن تُفعَّل التغييرات التي أجريت عليه إلا بعد بدء جلسة طرفية جديدة، أي لن تتمكن من الوصول إلى الأمر rvm في الجلسة الحالية لذا نفذ الأمر التالي لتخطي هذه المشكلة:
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs ruby"><span class="hljs-variable"><span class="pln">$ </span></span><span class="pln">source </span><span class="pun">~</span><span class="hljs-regexp"><span class="str">/.rvm/</span><span class="pln">scripts</span></span><span class="hljs-regexp"><span class="pun">/</span><span class="pln">rvm</span></span></code></pre>

<h2 id="الخطوة-الثالثة-تثبيت-ruby">
	الخطوة الثالثة: تثبيت Ruby
</h2>

<p>
	يمكن الآن استخدام الأمر rvm لتثبيت أحدث إصدار من Ruby وكل ما يتعلق بها وتعيينه الإصدار الافتراضي الذي سيستخدمه نظام التشغيل وبذلك لن يحدث أي تضارب إن كان هنالك إصدار آخر مثبت على النظام؛ نفذ الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs haskell"><span class="pln">$ rvm install ruby </span><span class="pun">–</span><span class="hljs-default"><span class="hljs-keyword"><span class="kwd">default</span></span></span></code></pre>

<p>
	ستبدأ العملية أولًا بتنزيل أحدث إصدار من Ruby.
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs avrasm"><span class="typ">Searching</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> binary rubies</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pln"> might take some time</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Found</span><span class="pln"> remote file https</span><span class="pun">:</span><span class="com">//rvm_io</span><span class="hljs-preprocessor"><span class="com">.global</span></span><span class="hljs-preprocessor"><span class="com">.<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></span></span><span class="hljs-preprocessor"><span class="com">.fastly</span></span><span class="hljs-preprocessor"><span class="com">.net</span></span><span class="com">/binaries/ubuntu/</span><span class="hljs-number"><span class="com">16.04</span></span><span class="com">/x86_64/ruby-</span><span class="hljs-number"><span class="com">2.4</span></span><span class="hljs-number"><span class="com">.0</span></span><span class="hljs-preprocessor"><span class="com">.tar</span></span><span class="hljs-preprocessor"><span class="com">.bz</span></span><span class="com">2</span></code></pre>

<p>
	هنالك بعض الحزم اللازمة لعمل Ruby فإن كانت غير موجودة على النظام فستثبَّت تلقائيًّا.
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs lasso"><span class="typ">Checking</span><span class="pln"> requirements </span><span class="kwd">for</span><span class="pln"> ubuntu</span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">
</span><span class="typ">Installing</span><span class="pln"> requirements </span><span class="kwd">for</span><span class="pln"> ubuntu</span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">
</span><span class="typ">Updating</span><span class="pln"> system</span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">
</span><span class="typ">Installing</span><span class="pln"> required packages</span><span class="pun">:</span><span class="pln"> gawk</span><span class="pun">,</span><span class="pln"> libssl</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">dev</span></span><span class="pun">,</span><span class="pln"> zlib1g</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">dev</span></span><span class="pun">,</span><span class="pln"> libyaml</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">dev</span></span><span class="pun">,</span><span class="pln"> libsqlite3</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">dev</span></span><span class="pun">,</span><span class="pln"> sqlite3</span><span class="pun">,</span><span class="pln"> autoconf</span><span class="pun">,</span><span class="pln"> libgmp</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">dev</span></span><span class="pun">,</span><span class="pln"> libgdbm</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">dev</span></span><span class="pun">,</span><span class="pln"> libncurses5</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">dev</span></span><span class="pun">,</span><span class="pln"> automake</span><span class="pun">,</span><span class="pln"> libtool</span><span class="pun">,</span><span class="pln"> bison</span><span class="pun">,</span><span class="pln"> libffi</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">dev</span></span><span class="pun">,</span><span class="pln"> libgmp</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">dev</span></span><span class="pun">,</span><span class="pln"> libreadline6</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">dev</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="pln">
</span><span class="typ">Requirements</span><span class="pln"> installation successful</span><span class="hljs-built_in"><span class="pun">.</span></span></code></pre>

<p>
	سيُطلب منك إدخال كلمة المرور لبدء عملة التنزيل والتثبيت؛ بعد الانتهاء من تثبيت الحزم السابقة ستبدأ عملية تنزيل وتثبيت Ruby.
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs lasso"><span class="pln">ruby</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">2.4</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-variable"><span class="com">#configure</span></span><span class="pln">
ruby</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">2.4</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-variable"><span class="com">#download</span></span><span class="pln">
  </span><span class="hljs-subst"><span class="pun">%</span></span><span class="pln"> </span><span class="typ">Total</span><span class="pln">    </span><span class="hljs-subst"><span class="pun">%</span></span><span class="pln"> </span><span class="typ">Received</span><span class="pln"> </span><span class="hljs-subst"><span class="pun">%</span></span><span class="pln"> </span><span class="typ">Xferd</span><span class="pln">  </span><span class="hljs-keyword"><span class="typ">Average</span></span><span class="pln"> </span><span class="typ">Speed</span><span class="pln">   </span><span class="typ">Time</span><span class="pln">    </span><span class="typ">Time</span><span class="pln">     </span><span class="typ">Time</span><span class="pln">  </span><span class="typ">Current</span><span class="pln">
</span><span class="typ">Dload</span><span class="pln">  </span><span class="typ">Upload</span><span class="pln">   </span><span class="typ">Total</span><span class="pln">   </span><span class="typ">Spent</span><span class="pln">    </span><span class="typ">Left</span><span class="pln">  </span><span class="typ">Speed</span><span class="pln">
</span><span class="hljs-number"><span class="lit">100</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">16.4</span></span><span class="lit">M</span><span class="pln">  </span><span class="hljs-number"><span class="lit">100</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">16.4</span></span><span class="lit">M</span><span class="pln">    </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">     </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">  </span><span class="hljs-number"><span class="lit">4828</span></span><span class="lit">k</span><span class="pln">      </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">  </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">00</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">03</span></span><span class="pln">  </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">00</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">03</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">--</span></span><span class="pun">:</span><span class="hljs-subst"><span class="pun">--</span></span><span class="pun">:</span><span class="hljs-subst"><span class="pun">--</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">4829</span></span><span class="lit">k</span><span class="pln">
ruby</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">2.4</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-variable"><span class="com">#validate</span></span><span class="com"> archive</span><span class="pln">
ruby</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">2.4</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-variable"><span class="com">#extract</span></span><span class="pln">
ruby</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">2.4</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-variable"><span class="com">#validate</span></span><span class="com"> binary</span><span class="pln">
ruby</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">2.4</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-variable"><span class="com">#setup</span></span><span class="pln">
ruby</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">2.4</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-variable"><span class="com">#gemset</span></span><span class="com"> created /home/brian</span><span class="hljs-subst"><span class="com">/</span></span><span class="hljs-built_in"><span class="com">.</span></span><span class="com">rvm/gems/ruby</span><span class="hljs-subst"><span class="com">-</span></span><span class="hljs-number"><span class="com">2.4</span></span><span class="hljs-number"><span class="com">.0</span></span><span class="com">@</span><span class="hljs-built_in"><span class="com">global</span></span><span class="pln">
ruby</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">2.4</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-variable"><span class="com">#importing</span></span><span class="com"> gemset /home/brian</span><span class="hljs-subst"><span class="com">/</span></span><span class="hljs-built_in"><span class="com">.</span></span><span class="com">rvm/gemsets/</span><span class="hljs-built_in"><span class="com">global</span></span><span class="hljs-built_in"><span class="com">.</span></span><span class="com">gems</span><span class="hljs-attribute"><span class="com">...</span></span><span class="hljs-attribute"><span class="com">...</span></span><span class="hljs-attribute"><span class="com">...</span></span><span class="hljs-attribute"><span class="com">...</span></span><span class="hljs-attribute"><span class="com">...</span></span><span class="hljs-attribute"><span class="com">...</span></span><span class="hljs-attribute"><span class="com">...</span></span><span class="hljs-attribute"><span class="com">...</span></span><span class="hljs-attribute"><span class="com">...</span></span><span class="hljs-attribute"><span class="com">...</span></span><span class="pln">
ruby</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">2.4</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-variable"><span class="com">#generating</span></span><span class="com"> </span><span class="hljs-built_in"><span class="com">global</span></span><span class="com"> wrappers</span><span class="hljs-attribute"><span class="com">...</span></span><span class="hljs-attribute"><span class="com">...</span></span><span class="hljs-built_in"><span class="com">..</span></span><span class="pln">
ruby</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">2.4</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-variable"><span class="com">#gemset</span></span><span class="com"> created /home/brian</span><span class="hljs-subst"><span class="com">/</span></span><span class="hljs-built_in"><span class="com">.</span></span><span class="com">rvm/gems/ruby</span><span class="hljs-subst"><span class="com">-</span></span><span class="hljs-number"><span class="com">2.4</span></span><span class="hljs-number"><span class="com">.0</span></span><span class="pln">
ruby</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">2.4</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-variable"><span class="com">#importing</span></span><span class="com"> gemsetfile /home/brian</span><span class="hljs-subst"><span class="com">/</span></span><span class="hljs-built_in"><span class="com">.</span></span><span class="com">rvm/gemsets/default</span><span class="hljs-built_in"><span class="com">.</span></span><span class="com">gems evaluated </span><span class="hljs-keyword"><span class="com">to</span></span><span class="com"> empty gem </span><span class="hljs-built_in"><span class="com">list</span></span><span class="pln">
ruby</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">2.4</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-variable"><span class="com">#generating</span></span><span class="com"> default wrappers</span><span class="hljs-attribute"><span class="com">...</span></span><span class="hljs-built_in"><span class="com">..</span></span><span class="com">…</span></code></pre>

<p>
	بعد الانتهاء من العملية السابقة، ستكون لغة البرمجة Ruby بأحدث إصدار لها قد ثُبِّتت على حاسوبك بالإضافة إلى بعض الأدوات المرتبطة بها مثل الأداء irb وهي الطرفية التفاعلية في Ruby، والأداة rake التي تستطيع بوساطتها تشغيل السكربتات تلقائيًّا، والأداة gem لتثبيت وتحديث المكتبات.<br>
	استخدم الأمر التالي لمعرفة رقم الإصدار الذي ثُبِّت للتو:
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs ruby"><span class="hljs-variable"><span class="pln">$ </span></span><span class="pln">ruby </span><span class="pun">-</span><span class="pln">v</span></code></pre>

<p>
	وستظهر لك نتيجة شبيه بالنتيجة التالية:
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs css"><span class="hljs-tag"><span class="pln">ruby</span></span><span class="pln"> </span><span class="lit">2</span><span class="hljs-class"><span class="lit">.4</span></span><span class="hljs-class"><span class="pun">.</span><span class="lit">0p0</span></span><span class="pln"> </span><span class="pun">(</span><span class="lit">2016</span><span class="hljs-tag"><span class="pun">-</span><span class="lit">12</span><span class="pun">-</span><span class="lit">24</span></span><span class="pln"> </span><span class="hljs-tag"><span class="pln">revision</span></span><span class="pln"> </span><span class="lit">57164</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-attr_selector"><span class="pun">[</span><span class="pln">x86_64</span><span class="pun">-</span><span class="pln">linux</span><span class="pun">]</span></span></code></pre>

<p>
	انتهينا من تثبيت لغة البرمجة Ruby؛ في كل مرة تريد استخدامها افتح موجه الأوامر ثمَّ سجل الدخول إلى الصدفة بكتابة الأمر (bash -l)؛ إن لم يعمل مدير إصدارات Ruby ‏(RVM) عند بدء جلسة جديدة تلقائيًّا فتأكد من تعديل ملف البدء ‏‎.bashrc الذي تحدثنا عنه سابقًا أو ستضطر لتنفيذ الأمر التالي كل مرة تسجل فيها الدخول إلى الصدفة.
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs ruby"><span class="hljs-variable"><span class="pln">$ </span></span><span class="pln">source </span><span class="pun">~</span><span class="hljs-regexp"><span class="str">/.rvm/</span><span class="pln">scripts</span></span><span class="hljs-regexp"><span class="pun">/</span><span class="pln">rvm</span></span></code></pre>

<h2 id="الخطوة-الرابعة-إنشاء-برنامج-بسيط">
	الخطوة الرابعة: إنشاء برنامج بسيط
</h2>

<p>
	سننشئ في هذه الخطوة برنامجًا بسيطًا جدًا يظهر الرسالة “Hello, world” للتأكد من بيئة العمل وأنَّ كلَّ شيء يعمل بشكل صحيح.<br>
	سننشئ أولًا ملف باسم hello.rb باستخدام المحرر النصي nano.
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs ruby"><span class="hljs-variable"><span class="pln">$ </span></span><span class="pln">nano hello</span><span class="pun">.</span><span class="pln">rb</span></code></pre>

<p>
	اكتب النص التالي داخل الملف:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_2027_11" style="">
<span class="pln">puts 
</span><span class="str">"Hello, World!"</span></pre>

<p>
	اضغط <code>Ctrl+X</code> للخروج من المحرر، وسيسألك إن كنت تريد حفظ التغييرات فاضغط Y للموافقة والخروج.<br>
	شغل البرنامج بكل بساطة باستخدام الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs ruby"><span class="hljs-variable"><span class="pln">$ </span></span><span class="pln">ruby hello</span><span class="pun">.</span><span class="pln">rb</span></code></pre>

<p>
	سيُنفذ البرنامج الذي كتبته للتو وستظهر على الشاشة الرسالة:
</p>

<pre class="ipsCode" id="ips_uid_2027_9">
<code class="hljs erlang-repl"><span class="hljs-variable"><span class="typ">Hello</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-function_or_atom"><span class="pln">world</span></span><span class="hljs-exclamation_mark"><span class="pun">!</span></span></code></pre>

<p>
	نتأكد بذلك أنَّ كل شيء على ما يرام.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	أصبحت الآن لغة البرمجة Ruby جاهزة للعمل على حاسوبك ذي النظام ويندوز 10؛ انطلق الآن لبدء استخدام لغة البرمجة Ruby واستكشافها لإنشاء البرامج وكتابة الأكواد وتطوير التطبيقات أو الويب.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-ruby-and-set-up-a-local-programming-environment-on-windows-10" rel="external nofollow">How To Install Ruby and Set Up a Local Programming Environment on Windows 10</a> لصاحبه Brian Hogan
</p>
]]></description><guid isPermaLink="false">547</guid><pubDate>Tue, 17 Oct 2017 14:06:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x633;&#x631;&#x64A;&#x639; &#x625;&#x644;&#x649; &#x644;&#x63A;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x631;&#x648;&#x628;&#x64A; Ruby</title><link>https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-ruby-r529/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_09/59b2396355db0_main(23).png.96403f80ca802f3ddcb2bedb9ed4eff1.png" /></p>

<p>
	في هذا المقال، نقدم لكم لمحة سريعة عن أساسيات لغة البرمجة روبي، ويعتبر هذا المقال مُخصص بالدرجة الأولى للمبتدئين في تعلم اللغة ولديهم أرضية مسبقة عن مفاهيم البرمجة بشكل عام. سنتناول في هذا المقال المواضيع التالية:
</p>

<ol>
<li>
		كتابة التعليقات.
	</li>
	<li>
		المصفوفات.
	</li>
	<li>
		جمل التحكم.
	</li>
	<li>
		معالجة الخطأ.
	</li>
	<li>
		بناء الوظائف.
	</li>
	<li>
		جملة yield.
	</li>
	<li>
		الفئات.
	</li>
</ol>
<p>
	ملاحظة: ناتج تنفيذ الأمثلة والأوامر الموجودة في هذا المقال تقع بعد علامة #=&gt; من كل نتيجة أو أمر.
</p>

<h2 id="كتابة-التعليقات">
	كتابة التعليقات
</h2>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<span class="com"># هذا تعليق</span><span class="pln">

</span><span class="pun">=</span><span class="kwd">begin</span><span class="pln">
</span><span class="pun">تعليق</span><span class="pln"> </span><span class="pun">من</span><span class="pln"> </span><span class="pun">أكثر</span><span class="pln"> </span><span class="pun">من</span><span class="pln"> </span><span class="pun">سطر</span><span class="pln">
</span><span class="pun">=</span><span class="kwd">end</span></pre>

<p>
	قبل البدء، لا بد من التنويه أن كل شيء عبارة عن كائن في لغة روبي. الأرقام عبارة عن كائنات، والوظيفة class في السطر التالي تعيد نوع الكائن:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-number"><span class="lit">3</span></span><span class="lit">.</span><span class="hljs-keyword"><span class="lit">class</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; Fixnum</span></span><span class="pln">

</span><span class="hljs-number"><span class="lit">3</span></span><span class="lit">.to</span><span class="pln">_s </span><span class="hljs-comment"><span class="com">#=&gt; "3"</span></span></code></pre>

<h2 id="العمليات-الحسابية-والثنائية">
	العمليات الحسابية والثنائية
</h2>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 2</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">8</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 7</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">10</span></span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 20</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">35</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 7</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">**</span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 32</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 2</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 1</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 7</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> </span><span class="pun">^</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 6</span></span></code></pre>

<p>
	العمليات الرياضية سهلة الاستدعاء على مستوى الكائن:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="hljs-number"><span class="lit">1</span></span><span class="lit">.</span><span class="pun">+(</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 4</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">10</span></span><span class="lit">.</span><span class="pun">*</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 50</span></span></code></pre>

<p>
	بعض القيم تُعتبر كائنات مثل:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-keyword"><span class="kwd">nil</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com"># تشبه القيمة الفارغة في اللغات الأخرى</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com"># صحيح منطقي</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">false</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com"># خطأ منطقي</span></span></code></pre>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-keyword"><span class="kwd">nil</span></span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; NilClass</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; TrueClass</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">false</span></span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; FalseClass</span></span></code></pre>

<p>
	المساواة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ini"><span class="hljs-setting"><span class="lit">1</span><span class="pln"> </span><span class="pun">=</span><span class="hljs-value"><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="com">#=&gt; </span><span class="hljs-keyword"><span class="com">true</span></span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="lit">2</span><span class="pln"> </span><span class="pun">=</span><span class="hljs-value"><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="com">#=&gt; </span><span class="hljs-keyword"><span class="com">false</span></span></span></span></code></pre>

<p>
	اللامساواة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; false</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; true</span></span></code></pre>

<p>
	تُعتبر القيمة الفارغة مرادفة للقيمة المنطقية الخاطئة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="pun">!</span><span class="hljs-keyword"><span class="kwd">nil</span></span><span class="pln">   </span><span class="hljs-comment"><span class="com">#=&gt; true</span></span><span class="pln">
</span><span class="pun">!</span><span class="hljs-keyword"><span class="kwd">false</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; true</span></span><span class="pln">
</span><span class="pun">!</span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">     </span><span class="hljs-comment"><span class="com">#=&gt; false</span></span></code></pre>

<p>
	المقارنات:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; true</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; false</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; true</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; true</span></span></code></pre>

<p>
	عمليات المقارنة المُجمعة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs php"><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; -1</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">10</span></span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 1</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 0</span></span></code></pre>

<p>
	العمليات المنطقية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="hljs-literal"><span class="kwd">true</span></span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="hljs-literal"><span class="kwd">false</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; false</span></span><span class="pln">
</span><span class="hljs-literal"><span class="kwd">true</span></span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="hljs-literal"><span class="kwd">false</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; true</span></span><span class="pln">
</span><span class="pun">!</span><span class="hljs-literal"><span class="kwd">true</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; false</span></span></code></pre>

<p>
	يوجد نسخة أخرى من العمليات المنطقية ولكن بتطبيق مفهوم الأولوية المنخفضة، مما يعني استخدامها كبناء للتحكم في التدفقات (Flow Control) وربط الجمل ببعضها حتى تقوم أحدها بإرجاع قيمة منطقية صحيحة أو خاطئة.<br>
	فمثلا، في السطر التالي تُستدعى do_something_else في حال كان استدعاء do_something ناجحاً.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="hljs-keyword"><span class="pln">do</span></span><span class="pln">_something</span><span class="pun">()</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">do</span></span><span class="pln">_something_</span><span class="hljs-keyword"><span class="pln">else</span></span><span class="pun">()</span></code></pre>

<p>
	وهنا يُستدعى log_error في حال فشل استدعاء: do_someting
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs erlang"><span class="hljs-function"><span class="hljs-title"><span class="pln">do_something</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="hljs-title"><span class="kwd">or</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">log_error</span></span><span class="hljs-params"><span class="pun">()</span></span></span></code></pre>

<h2 id="النصوص">
	النصوص
</h2>

<p>
	النصوص عبارة عن كائنات:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-string"><span class="str">'I am a string'</span></span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; String</span></span><span class="pln">
</span><span class="hljs-string"><span class="str">"I am a string too"</span></span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; String</span></span><span class="pln">

placeholder </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'use string interpolation'</span></span><span class="pln">
</span><span class="hljs-string"><span class="str">"I can </span><span class="hljs-subst"><span class="str">#{placeholder}</span></span><span class="str"> when using double quoted strings"</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">#=&gt; "I can use string interpolation when using double quoted strings"</span></span></code></pre>

<p>
	يُفضل استخدام علامة التنصيص المنفردة على المزدوجة وذلك قدر الإمكان. علامة التنصيص المزدوجة تُضيف بعض الحسابات الداخلية الزائدة، ومن الممكن جمع النصوص ببعضها بشرط عدم استخدام الأرقام.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs vhdl"><span class="hljs-attribute"><span class="str">'hello</span></span><span class="str"> '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'world</span></span><span class="str">'</span><span class="pln">  </span><span class="com">#=&gt; </span><span class="hljs-string"><span class="com">"hello world"</span></span><span class="pln">
</span><span class="hljs-attribute"><span class="str">'hello</span></span><span class="str"> '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> </span><span class="com">#=&gt; TypeError: can</span><span class="hljs-attribute"><span class="com">'t</span></span><span class="com"> convert Fixnum into </span><span class="hljs-typename"><span class="com">String</span></span><span class="pln">
</span><span class="hljs-attribute"><span class="str">'hello</span></span><span class="str"> '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3.</span></span><span class="lit">to</span><span class="pln">_s </span><span class="com">#=&gt; </span><span class="hljs-string"><span class="com">"hello 3"</span></span></code></pre>

<p>
	دمج النصوص مع العمليات:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="hljs-string"><span class="str">'hello '</span></span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; "hello hello hello "</span></span></code></pre>

<p>
	الإضافة لنص:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="hljs-string"><span class="str">'hello'</span></span><span class="pln"> </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="hljs-string"><span class="str">' world'</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; "hello world"</span></span></code></pre>

<p>
	لطباعة نص وسطر في النهاية نستخدم وظيفة puts:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs vala"><span class="pln">puts </span><span class="hljs-string"><span class="str">"I'm printing!"</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; I'm printing!</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; nil</span></span></code></pre>

<p>
	طباعة نص دون سطر في النهاية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs php"><span class="hljs-keyword"><span class="kwd">print</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">"I'm printing!"</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">#=&gt; I'm printing! =&gt; nil</span></span></code></pre>

<h2 id="المتغيرات">
	المتغيرات
</h2>

<p>
	تعريف المتغيرات:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="pln">x </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">25</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 25</span></span><span class="pln">
x </span><span class="hljs-comment"><span class="com">#=&gt; 25</span></span></code></pre>

<p>
	استخدام عملية المساواة تُرجع القيمة المستخدمة وهذا يعني أنك تستطيع إجراء عمليات مساواة متعددة كما المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="pln">x </span><span class="pun">=</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 10</span></span><span class="pln">
x </span><span class="hljs-comment"><span class="com">#=&gt; 10</span></span><span class="pln">
y </span><span class="hljs-comment"><span class="com">#=&gt; 10</span></span></code></pre>

<p>
	من المتعارف عليه استخدام طريقة snake_case في تسمية المتغيرات:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="pln">snake_</span><span class="hljs-keyword"><span class="pln">case</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-literal"><span class="kwd">true</span></span></code></pre>

<p>
	حاول أن تستخدم أسماء متغيرات ذات دلالة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="pln">path_to_project_root </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'/good/name/'</span></span><span class="pln">
path </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'/bad/name/'</span></span></code></pre>

<p>
	الرموز (Symbols) في لغة روبي عبارة عن كائنات، وهي ثابتة.<br>
	وتُمَثِّل الرموز ثوابت من الممكن إعادة استخدامها ويتم تمثيلها داخليا بأرقام. وغالبا يتم استخدامها بدلا من النصوص لتوصيل قيم ذات معنى ومحددة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-symbol"><span class="pun">:</span><span class="pln">pending</span></span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; Symbol</span></span><span class="pln">
status </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">pending</span></span><span class="pln">
status </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">pending</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; true</span></span><span class="pln">
status </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-string"><span class="str">'pending'</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; false</span></span><span class="pln">
status </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">approved</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; false</span></span></code></pre>

<h2 id="المصفوفات">
	المصفوفات
</h2>

<p>
	لتعريف مصفوفة نقوم بالتالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs php"><span class="hljs-keyword"><span class="pln">array</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">]</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; [1, 2, 3, 4, 5]</span></span></code></pre>

<p>
	من الممكن أن تحتوي المصفوفة على عناصر ذات أنواع مختلفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs rust"><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'hello'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">false</span></span><span class="pun">]</span><span class="pln"> </span><span class="com">#=&gt; [</span><span class="hljs-number"><span class="com">1</span></span><span class="com">, </span><span class="hljs-string"><span class="com">"hello"</span></span><span class="com">, </span><span class="hljs-keyword"><span class="com">false</span></span><span class="com">]</span></code></pre>

<p>
	يتم فهرسة المصفوفات بطريقة أمامية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs php"><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">[</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">]</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 1</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">.</span><span class="pln">first </span><span class="hljs-comment"><span class="com">#=&gt; 1</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">[</span><span class="hljs-number"><span class="lit">12</span></span><span class="pun">]</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; nil</span></span></code></pre>

<p>
	ومن الممكن فهرستها بطريقة عكسية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs php"><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">[-</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">]</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 5</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">.</span><span class="kwd">last</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 5</span></span></code></pre>

<p>
	ومن الممكن تحديد فهرس البداية والنهاية للحصول على جزء أو شريحة من المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs php"><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">[</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">]</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; [3, 4, 5]</span></span></code></pre>

<p>
	نستخدم وظيفة reverse لإجراء عملية عكس المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs livecodeserver"><span class="hljs-operator"><span class="pln">a</span></span><span class="pun">=[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">]</span><span class="pln">
</span><span class="hljs-operator"><span class="pln">a</span></span><span class="pun">.</span><span class="pln">reverse</span><span class="pun">!</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; [3,2,1]</span></span></code></pre>

<p>
	من الممكن أيضا أن نستخدم نطاقًا لإجراء عملية الاقتطاع من المصفوفة بالطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs php"><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">[</span><span class="hljs-number"><span class="lit">1.</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">3</span></span><span class="pun">]</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; [2, 3, 4]</span></span></code></pre>

<p>
	لإجراء عملية الإضافة على المصفوفة نقوم بالتالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs cpp"><span class="hljs-stl_container"><span class="hljs-built_in"><span class="pln">array</span></span><span class="pln"> </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="lit">6</span><span class="pln"> </span><span class="com">#=&gt;</span></span><span class="com"> [</span><span class="hljs-number"><span class="com">1</span></span><span class="com">, </span><span class="hljs-number"><span class="com">2</span></span><span class="com">, </span><span class="hljs-number"><span class="com">3</span></span><span class="com">, </span><span class="hljs-number"><span class="com">4</span></span><span class="com">, </span><span class="hljs-number"><span class="com">5</span></span><span class="com">, </span><span class="hljs-number"><span class="com">6</span></span><span class="com">]</span></code></pre>

<p>
	أو :
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs php"><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; [1, 2, 3, 4, 5, 6]</span></span></code></pre>

<p>
	للتأكد من وجود قيمة في المصفوفة نستخدم الوظيفة include :
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs php"><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">include</span></span><span class="pun">?(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; true</span></span></code></pre>

<h2 id="هاش-hash">
	هاش Hash
</h2>

<p>
	الهاش Hash في لغة روبي هو القاموس الرئيسي باستخدام المفتاح والقيمة، ولتعريف الهاش نستخدم الأقواس المزخرفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs php"><span class="pln">hash </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="hljs-string"><span class="str">'color'</span></span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="hljs-string"><span class="str">'green'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'number'</span></span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="pun">}</span><span class="pln">
hash</span><span class="pun">.</span><span class="pln">keys </span><span class="hljs-comment"><span class="com">#=&gt; ['color', 'number']</span></span></code></pre>

<p>
	يتم البحث في الهاش باستخدام المفتاح بالطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">hash</span></span><span class="pun">[</span><span class="hljs-string"><span class="str">'color'</span></span><span class="pun">]</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 'green'</span></span><span class="pln">
</span><span class="hljs-built_in"><span class="pln">hash</span></span><span class="pun">[</span><span class="hljs-string"><span class="str">'number'</span></span><span class="pun">]</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 5</span></span></code></pre>

<p>
	في حالة البحث في الهاش باستخدام مفتاح غير موجود فإن النتيجة المرجعة هي nil :
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">hash</span></span><span class="pun">[</span><span class="hljs-string"><span class="str">'nothing here'</span></span><span class="pun">]</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; nil</span></span></code></pre>

<p>
	بعد نسخة روبي 1.9 يوجد طريقة خاصة لاستخدام الرموز كمفاتيح للهاش:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="pln">new_</span><span class="hljs-built_in"><span class="pln">hash</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> defcon</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> action</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-literal"><span class="kwd">true</span></span><span class="pln"> </span><span class="pun">}</span><span class="pln">
new_hash</span><span class="pun">.</span><span class="pln">keys </span><span class="hljs-comment"><span class="com">#=&gt; [:defcon, :action]</span></span></code></pre>

<p>
	لفحص وجود مفتاح أو قيمة في الهاش نستخدم الطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs avrasm"><span class="pln">new_hash</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">key</span></span><span class="pun">?(:</span><span class="pln">defcon</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com">#=&gt; true</span></span><span class="pln">
new_hash</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">value</span></span><span class="pun">?(</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com">#=&gt; true</span></span></code></pre>

<p>
	ملاحظة/ المصفوفات والهاش في الروبي قابلة للعد (Enumerable) ، وكلاهما يحتوي على مجموعة من الوظائف المفيدة.
</p>

<h2 id="جمل-التحكم">
	جمل التحكم
</h2>

<p>
	جملة الشرط:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pln">
  </span><span class="hljs-string"><span class="str">'if statement'</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">elsif</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">false</span></span><span class="pln">
  </span><span class="hljs-string"><span class="str">'else if, optional'</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">else</span></span><span class="pln">
  </span><span class="hljs-string"><span class="str">'else, also optional'</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	جملة التكرار for:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs vala"><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> counter </span><span class="kwd">in</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1.</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">5</span></span><span class="pln">
  puts </span><span class="hljs-string"><span class="str">"iteration #{counter}"</span></span><span class="pln">
</span><span class="kwd">end</span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; iteration 1</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; iteration 2</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; iteration 3</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; iteration 4</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; iteration 5</span></span></code></pre>

<p>
	على الرغم من وجود جملة التكرار وشيوعها، إلا أنه لا يوجد من يستخدمها، وبدلا من ذلك يجب عليك استخدام جملة each وتمرير كتلة من الشفرة البرمجية لها.<br>
	هذه الكتلة من الشفرة البرمجية تُرادف lambdas أو الوظائف الوهمية.<br>
	عند استخدام وظيفة each مع نطاق من الأرقام، فإن كتلة الشفرة البرمجية المُمَرَرَة لها تُنفذ مرة واحدة مع كل عنصر من النطاق.<br>
	يُمرَّر عداد كمعامل لكتلة الشفرة البرمجية،وتُكتَب جملة each بالطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs vala"><span class="pun">(</span><span class="hljs-number"><span class="lit">1.</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">5</span></span><span class="pun">).</span><span class="pln">each </span><span class="hljs-keyword"><span class="kwd">do</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln">counter</span><span class="pun">|</span><span class="pln">
  puts </span><span class="hljs-string"><span class="str">"iteration #{counter}"</span></span><span class="pln">
</span><span class="kwd">end</span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; iteration 1</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; iteration 2</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; iteration 3</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; iteration 4</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; iteration 5</span></span></code></pre>

<p>
	نستطيع إحاطة كتلة الشفرة البرمجية بأقواس مزخرفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="lit">.</span><span class="pun">.</span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">).</span><span class="pln">each </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">counter</span><span class="pun">|</span><span class="pln"> puts </span><span class="hljs-string"><span class="str">"iteration </span><span class="hljs-subst"><span class="str">#{counter}</span></span><span class="str">"</span></span><span class="pln"> </span><span class="pun">}</span></code></pre>

<p>
	نستطيع استخدام each للمرور على محتويات التراكيب مثل المصفوفات والهاش:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs livecodeserver"><span class="pln">array</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">each</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="kwd">do</span></span><span class="pln"> </span><span class="pun">|</span><span class="hljs-keyword"><span class="pln">element</span></span><span class="pun">|</span><span class="pln">
  puts </span><span class="hljs-string"><span class="str">"#{element} is part of the array"</span></span><span class="pln">
</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">end</span></span></span><span class="pln">
hash</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">each</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="kwd">do</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln">key</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">value</span></span><span class="pun">|</span><span class="pln">
  puts </span><span class="hljs-string"><span class="str">"#{key} is #{value}"</span></span><span class="pln">
</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">end</span></span></span></code></pre>

<p>
	إذا كنت تريد الحصول على فهرس العنصر الذي تمر عليه في جملة each تستطيع استخدام جملة each_with_index وتعريف متغير الفهرس من خلالها.<br>
	انظر المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="pln">array</span><span class="pun">.</span><span class="pln">each_with_index </span><span class="hljs-keyword"><span class="kwd">do</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln">element</span><span class="pun">,</span><span class="pln"> index</span><span class="pun">|</span><span class="pln">
  puts </span><span class="hljs-string"><span class="str">"</span><span class="hljs-subst"><span class="str">#{element}</span></span><span class="str"> is number </span><span class="hljs-subst"><span class="str">#{index}</span></span><span class="str"> in the array"</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
counter </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">while</span></span><span class="pln"> counter </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">do</span></span><span class="pln">
  puts </span><span class="hljs-string"><span class="str">"iteration </span><span class="hljs-subst"><span class="str">#{counter}</span></span><span class="str">"</span></span><span class="pln">
  counter </span><span class="pun">+=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">#=&gt; iteration 1</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">#=&gt; iteration 2</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">#=&gt; iteration 3</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">#=&gt; iteration 4</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">#=&gt; iteration 5</span></span></code></pre>

<p>
	توجد مجموعة من الوظائف الأخرى لتنفيذ الحلقات Loops في لغة الروبي، فمثلا توجد map، reduce ، inject والقائمة تطول.<br>
	Map تأخذ مصفوفة كمعامل، وتقوم بالمرور على عناصرها وإجراء عمليات عليها وترجعها في مصفوفة جديدة، كما المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs cpp"><span class="hljs-built_in"><span class="pln">array</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">]</span><span class="pln">
doubled </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">array</span></span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">map</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">do</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln">element</span><span class="pun">|</span><span class="pln">
  element </span><span class="pun">*</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">
</span><span class="kwd">end</span><span class="pln">
</span><span class="hljs-built_in"><span class="pln">puts</span></span><span class="pln"> doubled
</span><span class="hljs-preprocessor"><span class="com">#=&gt; [2,4,6,8,10]</span></span><span class="pln">
</span><span class="hljs-built_in"><span class="pln">puts</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">array</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#=&gt; [1,2,3,4,5]</span></span></code></pre>

<p>
	جملة case :
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs vhdl"><span class="pln">grade </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'B</span></span><span class="str">'</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">case</span></span><span class="pln"> grade
</span><span class="hljs-keyword"><span class="kwd">when</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'A</span></span><span class="str">'</span><span class="pln">
  puts </span><span class="hljs-attribute"><span class="str">'Way</span></span><span class="str"> </span><span class="hljs-keyword"><span class="str">to</span></span><span class="str"> go kiddo'</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">when</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'B</span></span><span class="str">'</span><span class="pln">
  puts </span><span class="hljs-attribute"><span class="str">'Better</span></span><span class="str"> luck </span><span class="hljs-keyword"><span class="str">next</span></span><span class="str"> </span><span class="hljs-typename"><span class="str">time</span></span><span class="str">'</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">when</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'C</span></span><span class="str">'</span><span class="pln">
  puts </span><span class="hljs-attribute"><span class="str">'You</span></span><span class="str"> can do better'</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">when</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'D</span></span><span class="str">'</span><span class="pln">
  puts </span><span class="hljs-attribute"><span class="str">'Scraping</span></span><span class="str"> through'</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">when</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'F</span></span><span class="str">'</span><span class="pln">
  puts </span><span class="hljs-attribute"><span class="str">'You</span></span><span class="str"> failed!'</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">else</span></span><span class="pln">
  puts </span><span class="hljs-attribute"><span class="str">'Alternative</span></span><span class="str"> grading system, eh?'</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
</span><span class="com">#=&gt; </span><span class="hljs-string"><span class="com">"Better luck next time"</span></span></code></pre>

<p>
	نستطيع استخدام نطاق مع جملة case بالطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="pln">grade </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">82</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">case</span></span><span class="pln"> grade
</span><span class="hljs-keyword"><span class="kwd">when</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">90</span></span><span class="lit">.</span><span class="pun">.</span><span class="hljs-number"><span class="lit">100</span></span><span class="pln">
  puts </span><span class="hljs-string"><span class="str">'Hooray!'</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">when</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">80</span></span><span class="lit">.</span><span class="pun">..</span><span class="hljs-number"><span class="lit">90</span></span><span class="pln">
  puts </span><span class="hljs-string"><span class="str">'OK job'</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">else</span></span><span class="pln">
  puts </span><span class="hljs-string"><span class="str">'You failed!'</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">#=&gt; "OK job"</span></span></code></pre>

<h2>
	معالجة الخطأ
</h2>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs vhdl"><span class="hljs-keyword"><span class="kwd">begin</span></span><span class="pln">
  </span><span class="kwd">raise</span><span class="pln"> </span><span class="typ">NoMemoryError</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'You</span></span><span class="str"> ran </span><span class="hljs-keyword"><span class="str">out</span></span><span class="str"> </span><span class="hljs-keyword"><span class="str">of</span></span><span class="str"> memory.'</span><span class="pln">
</span><span class="kwd">rescue</span><span class="pln"> </span><span class="typ">NoMemoryError</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> exception_variable
  puts </span><span class="hljs-attribute"><span class="str">'NoMemoryError</span></span><span class="str"> was raised'</span><span class="pun">,</span><span class="pln"> exception_variable
</span><span class="kwd">rescue</span><span class="pln"> </span><span class="typ">RuntimeError</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> other_exception_variable
  puts </span><span class="hljs-attribute"><span class="str">'RuntimeError</span></span><span class="str"> was raised now'</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">else</span></span><span class="pln">
  puts </span><span class="hljs-attribute"><span class="str">'This</span></span><span class="str"> runs </span><span class="hljs-keyword"><span class="str">if</span></span><span class="str"> no exceptions were thrown at </span><span class="hljs-keyword"><span class="str">all</span></span><span class="str">'</span><span class="pln">
</span><span class="kwd">ensure</span><span class="pln">
  puts </span><span class="hljs-attribute"><span class="str">'This</span></span><span class="str"> code always runs no matter what'</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<h2 id="بناء-الوظائف-والدوال">
	بناء الوظائف والدوال
</h2>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="kwd">double</span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln">
  x </span><span class="pun">*</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	الوظائف ضمنيا تعيد قيمة آخر جملة في الوظيفة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">double</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com">#=&gt; 4</span></span></code></pre>

<p>
	الأقواس تُعتبر إضافية، ومن الممكن استدعاء الوظيفة من دونهم:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs vbnet"><span class="hljs-built_in"><span class="kwd">double</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com">#=&gt; 6</span></span><span class="pln">

</span><span class="hljs-built_in"><span class="kwd">double</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="kwd">double</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com">#=&gt; 12</span></span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> sum</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span><span class="pln">
  x </span><span class="pun">+</span><span class="pln"> y
</span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	معاملات الوظائف يتم الفصل بينها بواسطة الفاصلة.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs livecodeserver"><span class="hljs-built_in"><span class="pln">sum</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 7</span></span><span class="pln">
</span><span class="hljs-built_in"><span class="pln">sum</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">sum</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">),</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; 12</span></span></code></pre>

<h2>
	جملة yield
</h2>

<p>
	كل الوظائف تمتلك ضمنيا معامل كتلة إضافي خاص بها، وتُستدعى بواسطة كلمة yield :
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="pln">surround
  puts </span><span class="hljs-string"><span class="str">'{'</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">yield</span></span><span class="pln">
  puts </span><span class="hljs-string"><span class="str">'}'</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
surround </span><span class="pun">{</span><span class="pln"> puts </span><span class="hljs-string"><span class="str">'hello world'</span></span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="hljs-comment"><span class="com"># {</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com"># hello world</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com"># }</span></span></code></pre>

<p>
	تستطيع تمرير كتلة من الشفرة البرمجية للوظيفة، ونستخدم رمز &amp; لحفظ عنوان كتلة الشفرة البرمجية المُمَرَرَة.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs vhdl"><span class="kwd">def</span><span class="pln"> guests</span><span class="pun">(&amp;</span><span class="hljs-keyword"><span class="pln">block</span></span><span class="pun">)</span><span class="pln">
  </span><span class="hljs-keyword"><span class="pln">block</span></span><span class="pun">.</span><span class="pln">call </span><span class="hljs-attribute"><span class="str">'some_argument</span></span><span class="str">'</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	تستطيع تمرير أكثر من معامل للوظيفة بشكل غير محدد باستخدام رمز *، وهذه المجموعة من المعاملات تتحول إلى مصفوفة والتي بدورك تستطيع المرور عليها باستخدام جملة each:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs vbscript"><span class="kwd">def</span><span class="pln"> guests</span><span class="pun">(*</span><span class="hljs-built_in"><span class="pln">array</span></span><span class="pun">)</span><span class="pln">
  </span><span class="hljs-built_in"><span class="pln">array</span></span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">each</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">|</span><span class="pln">guest</span><span class="pun">|</span><span class="pln"> puts guest </span><span class="pun">}</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	إذا كانت الوظيفة تُرجع مصفوفة، فإنك تستطيع استخدام المساواة المتعددة لأكثر من متغير في نفس الوقت (unpacking):
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="pln">foods
    </span><span class="pun">[</span><span class="hljs-string"><span class="str">'pancake'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'sandwich'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'quesadilla'</span></span><span class="pun">]</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
breakfast</span><span class="pun">,</span><span class="pln"> lunch</span><span class="pun">,</span><span class="pln"> dinner </span><span class="pun">=</span><span class="pln"> foods
breakfast </span><span class="hljs-comment"><span class="com">#=&gt; 'pancake'</span></span><span class="pln">
dinner </span><span class="hljs-comment"><span class="com">#=&gt; 'quesadilla'</span></span></code></pre>

<p>
	من المتفق عليه أن كل الوظائف التي تعيد قيمة منطقية لابد أن تنتهي بعلامة استفهام عند استدعائها:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs bash"><span class="hljs-number"><span class="lit">5</span></span><span class="lit">.even</span><span class="pun">?</span><span class="pln"> </span><span class="hljs-comment"><span class="com"># false</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">5</span></span><span class="lit">.odd</span><span class="pun">?</span><span class="pln"> </span><span class="hljs-comment"><span class="com"># true</span></span></code></pre>

<p>
	إذا كانت الوظيفة تنتهي بعلامة تعجب، فهذا يعني أن التغيير الذي يتم على المتغير أو العنصر يكون مباشرا على قيمته، أما بدون علامة تعجب، فإن العملية لا تؤثر على العنصر، ويتم إعادة التغيير في عنصر جديد. انظر للمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs avrasm"><span class="pln">company_name </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Dunder Mifflin"</span></span><span class="pln">
company_name</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">upcase</span></span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com">#=&gt; "DUNDER MIFFLIN"</span></span><span class="pln">
company_name </span><span class="hljs-preprocessor"><span class="com">#=&gt; "Dunder Mifflin"</span></span><span class="pln">
company_name</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">upcase</span></span><span class="pun">!</span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com"># we're mutating company_name this time!</span></span><span class="pln">
company_name </span><span class="hljs-preprocessor"><span class="com">#=&gt; "DUNDER MIFFLIN"</span></span></code></pre>

<h2 id="الأصناف-classes">
	الأصناف Classes
</h2>

<p>
	تُعرَّف الأصناف باستخدام الكلمة المحجوزة class:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">Human</span></span></span></code></pre>

<p>
	نعرّف في ما يلي متغيرًا على مستوى الصنف، وهو مُشارَك بين الكائنات المتولدة الخاصة بهذا الصنف:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="pln">  </span><span class="hljs-variable"><span class="pun">@</span><span class="lit">@species</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'H. sapiens'</span></span></code></pre>

<p>
	الطريقة الأساسية للاستهلال Initialization :
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs python"><span class="pln">  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">initialize</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> age </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">)</span></span></span></code></pre>

<p>
	إعطاء قيمة المعامل “الاسم” للمتغير الخاص بالكائن المتولد من الفئة بنفس الاسم
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs applescript"><span class="pln">    </span><span class="lit">@</span><span class="hljs-property"><span class="lit">name</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-property"><span class="pln">name</span></span></code></pre>

<p>
	في حالة عدم تمرير معامل باسم “العمر” فإن القيمة التلقائية هي التي ستمرر للمتغير الخاص بالكائن المتولد:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="pln">    </span><span class="hljs-variable"><span class="lit">@age</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> age
  </span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	وظيفة التعديل الأساسية (Setter):
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs applescript"><span class="pln">  </span><span class="kwd">def</span><span class="pln"> </span><span class="hljs-property"><span class="pln">name</span></span><span class="pun">=(</span><span class="hljs-property"><span class="pln">name</span></span><span class="pun">)</span><span class="pln">
    </span><span class="lit">@</span><span class="hljs-property"><span class="lit">name</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-property"><span class="pln">name</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	وظيفة الاسترجاع الأساسية (Getter):
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="pln">  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="pln">name
    </span><span class="hljs-variable"><span class="lit">@name</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	نستطيع تنفيذ وظيفتي التعديل والاسترجاع بواسطة attr_accessor كالتالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="pln">  </span><span class="hljs-keyword"><span class="pln">attr_accessor</span></span><span class="pln"> </span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">name</span></span></code></pre>

<p>
	ويمكن فصل العمليتين عن بعضهما.<br>
	المُسترجِع :getter
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="pln">  </span><span class="hljs-keyword"><span class="pln">attr_reader</span></span><span class="pln"> </span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">name</span></span></code></pre>

<p>
	المعدِّل setter:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="pln">  </span><span class="hljs-keyword"><span class="pln">attr_writer</span></span><span class="pln"> </span><span class="hljs-symbol"><span class="pun">:</span><span class="pln">name</span></span></code></pre>

<p>
	للتمييز بين الوظائف الخاصة بالصنف، والوظائف الخاصة بالكائن المتولد من الصنف، نستخدم كلمة self، وهي خاصة لتعريف الوظائف على مستوى الفئة.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="pln">  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="hljs-keyword"><span class="kwd">self</span></span><span class="pun">.</span><span class="pln">say</span><span class="pun">(</span><span class="pln">msg</span><span class="pun">)</span><span class="pln">
    puts msg
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="pln">species
    </span><span class="hljs-variable"><span class="pun">@</span><span class="lit">@species</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span></code></pre>

<p>
	تعريف كائنين من الصنف Human:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs cs"><span class="pln">jim </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Human</span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'Jim Halpert'</span></span><span class="pun">)</span><span class="pln">
dwight </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Human</span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'Dwight K. Schrute'</span></span><span class="pun">)</span></code></pre>

<p>
	استدعاء بعض الوظائف:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs avrasm"><span class="pln">jim</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">species</span></span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com">#=&gt; "H. sapiens"</span></span><span class="pln">
jim</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">name</span></span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com">#=&gt; "Jim Halpert"</span></span><span class="pln">
jim</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">name</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Jim Halpert II"</span></span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com">#=&gt; "Jim Halpert II"</span></span><span class="pln">
jim</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">name</span></span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com">#=&gt; "Jim Halpert II"</span></span><span class="pln">
dwight</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">species</span></span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com">#=&gt; "H. sapiens"</span></span><span class="pln">
dwight</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">name</span></span><span class="pln"> </span><span class="hljs-preprocessor"><span class="com">#=&gt; "Dwight K. Schrute"</span></span></code></pre>

<p>
	استدعاء الوظيفة على مستوى الصنف:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs perl"><span class="typ">Human</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">say</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'Hi'</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; "Hi"</span></span></code></pre>

<p>
	يُعرَّف مجال المتغيرات في المكان التي عُرِّف فيه المتغيّر، والمتغيرات التي تبدأ ب علامة $ تكون على مستوى النطاق الواسع Global Variable:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-variable"><span class="pln">$var</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"I'm a global var"</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">defined</span></span><span class="pun">?</span><span class="pln"> </span><span class="hljs-variable"><span class="pln">$var</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; "global-variable"</span></span></code></pre>

<p>
	المتغيرات التي تبدأ بعلامة @ تكون على مستوى الكائن المتولد:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-variable"><span class="lit">@var</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"I'm an instance var"</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">defined</span></span><span class="pun">?</span><span class="pln"> </span><span class="hljs-variable"><span class="lit">@var</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; "instance-variable"</span></span></code></pre>

<p>
	المتغيرات التي تبدأ ب @@ تكون على مستوى الصنف:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-variable"><span class="pun">@</span><span class="lit">@var</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"I'm a class var"</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">defined</span></span><span class="pun">?</span><span class="pln"> </span><span class="hljs-variable"><span class="pun">@</span><span class="lit">@var</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; "class variable"</span></span></code></pre>

<p>
	المتغيرات التي تبدأ بحرف كبير تكون ثوابتا:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs php"><span class="hljs-keyword"><span class="typ">Var</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"I'm a constant"</span></span><span class="pln">
</span><span class="kwd">defined</span><span class="pun">?</span><span class="pln"> </span><span class="hljs-keyword"><span class="typ">Var</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; "constant"</span></span></code></pre>

<p>
	المتغير الخاص بالصنف يتشاركه الصنف وكل الأصناف التي تريث منه:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-comment"><span class="com"># base class</span></span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">Human</span></span></span><span class="pln">
  </span><span class="hljs-variable"><span class="pun">@</span><span class="lit">@foo</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">

  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="hljs-keyword"><span class="kwd">self</span></span><span class="pun">.</span><span class="pln">foo
    </span><span class="hljs-variable"><span class="pun">@</span><span class="lit">@foo</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="hljs-keyword"><span class="kwd">self</span></span><span class="pun">.</span><span class="pln">foo</span><span class="pun">=(</span><span class="pln">value</span><span class="pun">)</span><span class="pln">
    </span><span class="hljs-variable"><span class="pun">@</span><span class="lit">@foo</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> value
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

</span><span class="hljs-comment"><span class="com"># derived class</span></span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">Worker</span></span><span class="pln"> </span><span class="hljs-inheritance"><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-parent"><span class="typ">Human</span></span></span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

</span><span class="hljs-constant"><span class="typ">Human</span></span><span class="pun">.</span><span class="pln">foo </span><span class="hljs-comment"><span class="com"># 0</span></span><span class="pln">
</span><span class="hljs-constant"><span class="typ">Worker</span></span><span class="pun">.</span><span class="pln">foo </span><span class="hljs-comment"><span class="com"># 0</span></span><span class="pln">

</span><span class="hljs-constant"><span class="typ">Human</span></span><span class="pun">.</span><span class="pln">foo </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com"># 2</span></span><span class="pln">
</span><span class="hljs-constant"><span class="typ">Worker</span></span><span class="pun">.</span><span class="pln">foo </span><span class="hljs-comment"><span class="com"># 2</span></span></code></pre>

<p>
	المتغير الخاص بالكائن المتولد من الصنف غير مشارك أو مرئي في الأصناف التي ترث من الصنف الرئيسي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs ruby"><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">Human</span></span></span><span class="pln">
  </span><span class="hljs-variable"><span class="lit">@bar</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">

  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="hljs-keyword"><span class="kwd">self</span></span><span class="pun">.</span><span class="pln">bar
    </span><span class="hljs-variable"><span class="lit">@bar</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

  </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span></span><span class="hljs-keyword"><span class="kwd">self</span></span><span class="pun">.</span><span class="pln">bar</span><span class="pun">=(</span><span class="pln">value</span><span class="pun">)</span><span class="pln">
    </span><span class="hljs-variable"><span class="lit">@bar</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> value
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

</span><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">Doctor</span></span><span class="pln"> </span><span class="hljs-inheritance"><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-parent"><span class="typ">Human</span></span></span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

</span><span class="hljs-constant"><span class="typ">Human</span></span><span class="pun">.</span><span class="pln">bar </span><span class="hljs-comment"><span class="com"># 0</span></span><span class="pln">
</span><span class="hljs-constant"><span class="typ">Doctor</span></span><span class="pun">.</span><span class="pln">bar </span><span class="hljs-comment"><span class="com"># nil</span></span></code></pre>

<p>
	عند استخدام عملية include لتضمين وحدة Module داخل صنف، فإن الوظائف الخاصة بالوحدة تكون مضمنة في الكائنات المتولدة من الصنف.<br>
	وعند استخدام عملية extend للوحدة داخل صنف، فإن الوظائف الخاصة بالوحدة تكون مضمنة في نفس الصنف.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs oxygene"><span class="hljs-keyword"><span class="kwd">module</span></span><span class="pln"> </span><span class="typ">ModuleExample</span><span class="pln">
  </span><span class="kwd">def</span><span class="pln"> foo
    </span><span class="hljs-string"><span class="str">'foo'</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="typ">Person</span><span class="pln">
  include </span><span class="typ">ModuleExample</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="typ">Book</span><span class="pln">
  extend </span><span class="typ">ModuleExample</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

</span><span class="typ">Person</span><span class="pun">.</span><span class="pln">foo     </span><span class="com"># =&gt; NoMethodError: undefined </span><span class="hljs-function"><span class="hljs-keyword"><span class="com">method</span></span><span class="com"> `</span><span class="hljs-title"><span class="com">foo</span></span><span class="com">' </span><span class="hljs-title"><span class="com">for</span></span><span class="com"> </span><span class="hljs-title"><span class="com">Person</span></span><span class="com">:</span></span><span class="hljs-keyword"><span class="com">Class</span></span><span class="pln">
</span><span class="typ">Person</span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pun">.</span><span class="pln">foo </span><span class="com"># =&gt; </span><span class="hljs-string"><span class="com">'foo'</span></span><span class="pln">
</span><span class="typ">Book</span><span class="pun">.</span><span class="pln">foo       </span><span class="com"># =&gt; </span><span class="hljs-string"><span class="com">'foo'</span></span><span class="pln">
</span><span class="typ">Book</span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pun">.</span><span class="pln">foo   </span><span class="com"># =&gt; NoMethodError: undefined </span><span class="hljs-function"><span class="hljs-keyword"><span class="com">method</span></span><span class="com"> `</span><span class="hljs-title"><span class="com">foo</span></span><span class="com">'</span></span></code></pre>

<p>
	تُنفَّذ دوال استرداد Callbacks عندما تُطبَق include أو extend على الوحدة :
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_3537_40" style="">
<code class="hljs oxygene"><span class="hljs-keyword"><span class="kwd">module</span></span><span class="pln"> </span><span class="typ">ConcernExample</span><span class="pln">
  </span><span class="kwd">def</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">self</span></span><span class="pun">.</span><span class="pln">included</span><span class="pun">(</span><span class="kwd">base</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">base</span><span class="pun">.</span><span class="pln">extend</span><span class="pun">(</span><span class="typ">ClassMethods</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">base</span><span class="pun">.</span><span class="pln">send</span><span class="pun">(:</span><span class="pln">include</span><span class="pun">,</span><span class="pln"> </span><span class="typ">InstanceMethods</span><span class="pun">)</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

  </span><span class="hljs-keyword"><span class="kwd">module</span></span><span class="pln"> </span><span class="typ">ClassMethods</span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> bar
      </span><span class="hljs-string"><span class="str">'bar'</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

  </span><span class="hljs-keyword"><span class="kwd">module</span></span><span class="pln"> </span><span class="typ">InstanceMethods</span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> qux
      </span><span class="hljs-string"><span class="str">'qux'</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="typ">Something</span><span class="pln">
  include </span><span class="typ">ConcernExample</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pln">

</span><span class="typ">Something</span><span class="pun">.</span><span class="pln">bar     </span><span class="com"># =&gt; </span><span class="hljs-string"><span class="com">'bar'</span></span><span class="pln">
</span><span class="typ">Something</span><span class="pun">.</span><span class="pln">qux     </span><span class="com"># =&gt; NoMethodError: undefined </span><span class="hljs-function"><span class="hljs-keyword"><span class="com">method</span></span><span class="com"> `</span><span class="hljs-title"><span class="com">qux</span></span><span class="com">'</span><span class="pln">
</span><span class="hljs-title"><span class="typ">Something</span></span><span class="pun">.</span><span class="hljs-title"><span class="kwd">new</span></span><span class="pun">.</span><span class="hljs-title"><span class="pln">bar</span></span><span class="pln"> </span><span class="com"># =&gt; </span><span class="hljs-title"><span class="com">NoMethodError</span></span><span class="com">:</span></span><span class="com"> undefined </span><span class="hljs-function"><span class="hljs-keyword"><span class="com">method</span></span><span class="com"> `</span><span class="hljs-title"><span class="com">bar</span></span><span class="com">'</span><span class="pln">
</span><span class="hljs-title"><span class="typ">Something</span></span><span class="pun">.</span><span class="hljs-title"><span class="kwd">new</span></span><span class="pun">.</span><span class="hljs-title"><span class="pln">qux</span></span><span class="pln"> </span><span class="com"># =&gt; '</span><span class="hljs-title"><span class="com">qux</span></span><span class="com">'</span></span></code></pre>

<p>
	ترجمة – بتصرّف – للمقال <a href="https://learnxinyminutes.com/docs/ruby/" rel="external nofollow">Learn X in Y minutes Where X=ruby</a>.
</p>
]]></description><guid isPermaLink="false">529</guid><pubDate>Fri, 08 Sep 2017 06:32:17 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62D;&#x644;&#x642;&#x627;&#x62A; (Loops) &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x628;&#x631;&#x645;&#x62C;&#x629; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-loops-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-r284/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/ruby-loops.png.45b3860a31f0e28ec02fb1bad60a8ee5.png" /></p>

<div id="wmd-preview-section-10">
	<p id="الحلقات-في-روبي">
		تعرّفنا في الدّرس السّابق على <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%84%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r283/" rel="">المجالات</a> وكيفيّة استخدامها مع <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r274/" rel="">العبارات الشرطيّة</a>. سنتعرّف في هذا الدّرس على أنواع الحلقات Loops المختلفة والتي يمكن استخدامها في روبي. 
	</p>

	<p style="text-align: center;">
		<img alt="ruby-loops.png" class="ipsImage ipsImage_thumbnailed" data-fileid="12951" data-unique="lo77rzlsj" src="https://academy.hsoub.com/uploads/monthly_2016_02/ruby-loops.png.60a1411e2cadd5b7a1938902e5f01915.png"></p>

	<p>
		تُستخدم الحواسيب عادةً لتنفيذ أوامر متكرّرة آليًّا. تكرار تنفيذ مهام متشابهة دون خطأ هي عمليّة من السّهل على الحواسيب فعلها على أتمّ وجه، على عكس الإنسان الذي غالبًا ما يفشل في ذلك. ولأن التكرار أحد الأمور الشّائعة في البرمجة فإن روبي توفّر عدّة طرق لتنفيذه تسمّى بالحلقات. تقوم الحلقات بتكرار تنفيذ بعض الشيفرة البرمجيّة بناءً على شروط أو حالات معيّنة.
	</p>
</div>

<div id="wmd-preview-section-11">
	<h2 id="حلقة-while">
		حلقة while
	</h2>

	<p>
		أوّل نوع من الحلقات سنتعرّف عليه هو حلقة <span style="font-family:courier new,courier,monospace;">while</span>. تقوم حلقة <span style="font-family:courier new,courier,monospace;">while</span> بتكرار تنفيذ الشيفرة البرمجيّة الموجودة بداخلها متى صحّ شرط معيّن. لفهم الحلقة أكثر دعونا نأخذ مثالاً عليها. سنطبّق ما تعلّمناه في الدروس السّابقة ولتحسين برنامج لعبة إلقاء النّرد التي تعرّفنا عليها سابقًا. أنشئ ملفّ روبي وسمّه <span style="font-family:courier new,courier,monospace;">while.rb </span>أو أيّ اسم تريد مع كتابة <span style="font-family:courier new,courier,monospace;">rb.</span> في نهاية اسم الملف. واكتب الشيفرة البرمجيّة التالية به:
	</p>

	<pre class="ipsCode" id="ips_uid_3745_9">
number = 0
attempts = 0

while number &lt; 6
    number = rand(1..6)
    puts "You rolled #{number}"
    attempts += 1
end

puts "It took you #{attempts} attempts to roll number 6"</pre>

	<p>
		بدأنا أوّلاً بتعريف متغيّر باسم <span style="font-family:courier new,courier,monospace;">number</span> ومتغيّر باسم <span style="font-family:courier new,courier,monospace;">attempts</span>. وأعطينا المتغيّرين قيمة مبدئيّة صفر. سنستخدم المتغيّرين لاحقًا في حلقة <span style="font-family:courier new,courier,monospace;">while</span> لذلك فنحتاج إلى تهيئتهما أوّلاً في بداية البرنامج قبل تنفيذ حلقة <span style="font-family:courier new,courier,monospace;">while</span>. إن لم نفعل ذلك فسوف نحصل على رسالة خطأ Error إذا تم استخدامهما قبل حصولهما على قيمة. جرّب بنفسك حذف المتغيّرين وتنفيذ البرنامج وحاول تحليل رسالة الخطأ التي ستظهر إليك. 
	</p>

	<p>
		بعد ذلك لدينا الحلقة تبدأ باستخدام كلمة <span style="font-family:courier new,courier,monospace;">while</span> المفتاحيّة في السّطر الرّابع وتنتهي بـ <span style="font-family:courier new,courier,monospace;">end</span> في السّطر الثّامن (تعرّفنا على <span style="font-family:courier new,courier,monospace;">end</span> سابقًا عندما استخدمناها مع <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r274/" rel="">العبارات الشرطيّة</a>). وبين <span style="font-family:courier new,courier,monospace;">while</span> و<span style="font-family:courier new,courier,monospace;">end</span> لدينا الشيفرة البرمجيّة التي نريد تكرار تنفيذها متى تحقّق شرط الحلقة الموجود بعد كلمة <span style="font-family:courier new,courier,monospace;">while</span>. لدينا الشرط في هذه الحالة هو أن تكون قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">number</span> أقلّ من 6. أعتقد أنّك قد خمّنت كل هذا بمجرّد رؤيتك للبرنامج وقبل قراءة الشرح فمن السّهولة قراءة حلقة <span style="font-family:courier new,courier,monospace;">while</span> كما لو كانت إنجليزيّة عاديّة. ببساطة نخبر روبي أنّ تنفّذ مجموعة الشيفرة البرمجيّة متى (while) كان المتغيّر <span style="font-family:courier new,courier,monospace;">number</span> أقلّ من 6. 
	</p>

	<p>
		الآن وحيث أنّ قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">number</span> هي صفر في البداية فستقوم الحلقة بتنفيذ الشيفرة البرمجيّة مرّة واحدة على الأقل لأنّها ستبدأ وقيمة <span style="font-family:courier new,courier,monospace;">number</span> أقلّ من 6. <br>
		الآن بالنّظر إلى الشيفرة البرمجيّة بداخل <span style="font-family:courier new,courier,monospace;">while</span> والتي ستُنفّذ على الأقلّ مرّة واحدة نجد أنّها تبدأ بتعيين قيمة جديدة للمتغيّر <span style="font-family:courier new,courier,monospace;">number</span> وهي قيمة عشوائيّة من الأرقام الصحيحة بين 1 و6. تقابل هذه الشيفرة عمليّة إلقائك للنّرد. 
	</p>

	<p>
		بعد ذلك نستخدم أمر <span style="font-family:courier new,courier,monospace;">puts</span> لطباعة نصّ على الشّاشة يخبر المستخدم أنّ ناتج إلقائه للنّرد هو الرقم النّاتج عن الاختيار العشوائي بين 1 و6. تقابل هذه عمليّة سقوط النّرد وظهور الرّقم النّاتج. 
	</p>

	<p>
		في آخر سطر من هذه الحلقة سيتمّ زيادة قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">attempts</span> بواحد. تذكّر أنّ رمز <strong>=+</strong> هذا يعني إضافة القيمة الموجودة على الجانب الأيمن إلى قيمة <span style="font-family:courier new,courier,monospace;">attempts</span> الأصليّة وحفظ القيمة الجديدة في المتغيّر <span style="font-family:courier new,courier,monospace;">attempts</span>. إذًا في حالتنا هذه تضيف روبي 1 إلى <span style="font-family:courier new,courier,monospace;">attempts</span> في كلّ مرّة تُنفّذ الشيفرات. 
	</p>

	<p>
		الآن إذا كان الرقم العشوائي النّاتج لا زال أقلّ من 6 فسيتمّ تنفيذ هذه الشيفرات الموجودة داخل حلقة <span style="font-family:courier new,courier,monospace;">while</span> مجدّدًا، ممّا يعني تعيين رقم عشوائي جديد إلى المتغيّر <span style="font-family:courier new,courier,monospace;">number</span>، طباعة هذه القيمة الجديدة ثمّ زيادة قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">attempts</span> بواحد. ثمّ التحقّق هل قيمة <span style="font-family:courier new,courier,monospace;">number</span> الجديدة أقلّ من 6 وهكذا دواليك إلى أن تصبح قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">number</span> هي 6. حينها سيتمّ إيقاف الحلقة وطباعة الرسالة الموجودة في السطر 10 والتي تخبر المستخدم عدد المرّات التي ألقى فيها النّرد (والمتمثّلة في المتغيّر <span style="font-family:courier new,courier,monospace;">attempts</span>) قبل أن يصل إلى الرّقم 6. 
	</p>

	<p>
		جرّب تنفيذ هذا البرنامج بفتح الطرفيّة والوصول إلى المجلّد الذي يحتوي على الملفّ وكتابة أمر:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3745_23">
<span class="pln">ruby [file name]</span></pre>

	<p>
		حيث [file name] هو اسم الملفّ الخاصّ بك. <span style="font-family:courier new,courier,monospace;">while.rb</span> في حالتي. جرّب البرنامج أكثر من مرّة ولاحظ كيف تختلف المُخرجات Outputs في كلّ مرّة.
	</p>
</div>

<div id="wmd-preview-section-12">
	<h2 id="حلقة-until">
		حلقة until
	</h2>

	<p>
		حلقات <span style="font-family:courier new,courier,monospace;">until</span> تشبه إلى حدٍّ كبير حلقات <span style="font-family:courier new,courier,monospace;">while</span>. الفرق هو أن حلقة <span style="font-family:courier new,courier,monospace;">until</span> ستواصل التكرار إلى أن يتحقّق شرط معيّن. على عكس <span style="font-family:courier new,courier,monospace;">while</span> التي تواصل التكرار متى كان الشرط متحقّقًا وتتوقّف عند عدم تحقّقه. 
	</p>

	<p>
		لتوضيح الفكرة أكثر سنستعرض مثال على ذلك. أنشئ ملفّ جديد باسم <span style="font-family:courier new,courier,monospace;">until.rb</span> أو أيّ اسم آخر واكتب به الشيفرة البرمجيّة التّالية:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3745_25">
<span class="pln">puts "Hello! Type something"
input = ""

until input == "goodbye"
    puts input.upcase
    input = gets.chomp
end

puts "Bye! Let's play again soon"</span></pre>

	<p>
		أوّلاً بدأنا بطباعة رسالة للمستخدم ترشده إلى ما عليه فعله ومن جديد قمنا بإنشاء وتهيئة متغيّر باسم <span style="font-family:courier new,courier,monospace;">input</span> والذي سوف يستقبل مُدخلات المستخدم. عيّننا للمتغيّر سلسلة فارغة لأن روبي ستُرجع خطأ إذا ذُكر المتغيّر للمرّة الأولى في الحلقة دون ذكر سابق له. 
	</p>

	<p>
		الآن وبالنّظر إلى حلقة <span style="font-family:courier new,courier,monospace;">until</span> نجد أنّ لدينا الكلمة المفتاحيّة <span style="font-family:courier new,courier,monospace;">until</span> لبداية الحلقة و<span style="font-family:courier new,courier,monospace;">end</span> لإنهائها. لدينا أيضًا بعد <span style="font-family:courier new,courier,monospace;">until</span> الشرط الذي فور حدوثه ستتوقّف الحلقة عن تنفيذ الشيفرات الموجودة بداخلها. 
	</p>

	<p>
		هذه المرّة فإنّه الشيفرة البرمجيّة الموجودة في حلقة <span style="font-family:courier new,courier,monospace;">until</span> سيتمّ تكرار تنفيذها إلى أن (until) تكون قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">input</span> تساوي السلسلة "goodbye". 
	</p>

	<p>
		تذكّر كيف أنّ السلسلة الافتراضيّة المعيّنة للمتغيّر <span style="font-family:courier new,courier,monospace;">input</span> هي سلسلة فارغة، إذًا فإنّ الحلقة ستعمل على الأقلّ مرّة واحدة. 
	</p>

	<p>
		بالنّظر إلى داخل الحلقة، نرى أنّنا نستخدم أوّلاً أمر <span style="font-family:courier new,courier,monospace;">puts</span> لطباعة المُدخلات ونستخدم دالّة <span style="font-family:courier new,courier,monospace;">upcase</span> لطباعة تلك المُدخلات بأحرف كبيرة Capital Letters. هل يمكن أن تخمّن ما هي القيمة الأولى التي ستُطبع عند تنفيذ البرنامج وقبل كتابتك أيّة مدخلات؟ أعتقد أنّك توقّعتها، سلسلة فارغة. 
	</p>

	<p>
		في السطر التالي نقوم باستبدال القيمة الموجودة في المتغيّر <span style="font-family:courier new,courier,monospace;">input</span> بالقيمة الجديدة التي سيدخلها المستخدم. تذكّر استخدمنا دالّة <span style="font-family:courier new,courier,monospace;">chomp</span> للتخلّص من رمز Enter المضاف إلى نهاية المُدخل. 
	</p>

	<p>
		هذه الحلقة ستُكرّر ما يُدخله المستخدم ولكن بحروف كبيرة إلى أن يدخل المستخدم goodbye. وعند حدوث ذلك فستتوقّف الحلقة عن العمل ويطبع البرنامج الرسالة الأخيرة الموجودة في السطر 9 لإخبار المستخدم بانتهاء اللّعبة. 
	</p>

	<p>
		جرّب تنفيذ البرنامج. هل لاحظت كيف لا يطبع البرنامج كلمة goodbye بأحرف كبيرة عندما تكتبها؟ هل يمكنك جعل الحلقة تطبع goodbye بأحرف كبيرة أوّلاً ثم تتوقّف عن التنفيذ؟
	</p>
</div>

<div id="wmd-preview-section-13">
	<h2 id="المكررات">
		المكررات
	</h2>

	<p>
		سنتعرّف الآن على بعض أنواع المكرّرات Iterators. وهي عبارة عن بعض الدوال الخاصّة بـ<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r280/" rel="">المصفوفات</a>، <a href="https://academy.hsoub.com/programming/ruby/%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D8%A7%D9%84%D8%AA%D9%82%D8%B7%D9%8A%D8%B9-hash-tables-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r282/" rel="">جداول التقطيع</a> و <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%84%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r283/" rel="">المجالات</a> التي تحدّثنا عنها في الدروس السّابقة وعملها يشبه عمل الحلقات العاديّة.
	</p>
</div>

<div id="wmd-preview-section-14">
	<h3 id="دالة-each">
		دالة each
	</h3>

	<p>
		أوّل دالّة سنتعرّف عليها هي دالّة <span style="font-family:courier new,courier,monospace;">each</span> والتي يمكنك رؤيتها في المثال التّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3745_14">
<span class="pln">(1..10).each do |number|
    puts "#{number} squared is #{number**2}"
end</span></pre>

	<p>
		المجال الموجود هنا يمثّل الأعداد الصحيحة من 1 إلى 10 مع وجود 10 ضمنها. وبعدها استخدمنا دالّة <span style="font-family:courier new,courier,monospace;">each</span> عن طريق كتابتها بعد المجال وبين الاثنين نقطة والتي تمثّل طريقة استدعاء الدوال على أيّ كائن في روبي. وتنتهي بالكلمة المفتاحيّة <span style="font-family:courier new,courier,monospace;">end</span> مجدّدًا.
	</p>

	<p>
		ما تفعله هذه الدّالّة هو تنفيذ الشيفرة البرمجيّة الموجودة بداخلها على كلّ (each) عنصر موجود في المجال. لاحظ القيمة الموجودة في السّطر الأوّل <span style="font-family:courier new,courier,monospace;">number</span> الموجودة بين رمزي الأنبوب Pipe Symbols. تمثّل هذه القيمة ما يشبه المتغيّر المؤقّت لتخزين قيمة عنصر المجال وقت حدوث كلّ عمليّة تكرار. إذًا فستبدأ الدّالّة بتعيين قيمة للمتغيّر تساوي 1 ثمّ تُدخل تلك القيمة إلى السلسلة التابعة لأمر <span style="font-family:courier new,courier,monospace;">puts</span>. بمجرّد تنفيذ هذا الأمر سيتمّ زيادة قيمة المتغيّر لتصبح 2 وتُنفّذ الدّالّة أمر <span style="font-family:courier new,courier,monospace;">puts</span> من جديد. وستتابع الدّالّة فعل ذلك (أعني زيادة قيمة المتغيّر وتنفيذ أمر <span style="font-family:courier new,courier,monospace;">puts</span>) حتّى تصل إلى أن تكون قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">number</span> هي10. إذًا فهذا المتغيّر يعتبر نوعًا ما ماسك مكان Placeholder لكلّ رقم في كلّ تكرار يحدث في الدالّة. 
	</p>

	<p>
		الآن لنلق نظرة على الشيفرة الموجودة داخل الدّالّة. ما يفعله البرنامج هنا هو استخدام دالّة <span style="font-family:courier new,courier,monospace;">puts</span> لطباعة النصّ الذي نريد على الشّاشة وخاصيّة الاستيفاء Interpolation لطباعة الرقم ليمكننا رؤية كل رقم في المجال بدءًا من 1 ونهايةً بـ 10 ثم يخبرنا أنّ الرقم مربّعًا يساوي قيمة الاستيفاء الثّانية {number**2}#.
	</p>

	<p>
		تعرّفنا في درس <a href="https://academy.hsoub.com/programming/ruby/%D9%83%D9%8A%D9%81-%D8%AA%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r270/" rel="">التّعامل مع الأرقام</a> أنّ رمز النّجمة يمثّل عمليّة الضرب. الآن أخبرك أن رمزي النّجمة معًا يمثّلان الأُسّ Power. إذًا فإنّ <span style="font-family:courier new,courier,monospace;">number**2</span> تعني <span style="font-family:courier new,courier,monospace;">number</span> أسّ 2 أو قيمة <span style="font-family:courier new,courier,monospace;">number</span> مربّعة. أو بشكل آخر number number.
	</p>
</div>

<div id="wmd-preview-section-15">
	<h3 id="دالة-map">
		دالة map
	</h3>

	<p>
		تشبه دالّة <span style="font-family:courier new,courier,monospace;">map</span> دالّة <span style="font-family:courier new,courier,monospace;">each</span>. ولكن بدلاً من مجرّد تنفيذ الشيفرة البرمجيّة بداخلها فإنّها تقوم أيضًا بإنشاء مصفوفة جديدة (أو جدول تقطيع) يحتوي نتائج تنفيذ الشيفرة الموجودة بداخلها على المصفوفة التي تم تنفيذها عليها. كما أنه بإمكانها باستبدال القيمة الأصليّة بداخل المصفوفة أو جدول التقطيع بالقيمة النّاتجة عن الشيفرة الموجودة داخل المكرّر أو الدّالّة <span style="font-family:courier new,courier,monospace;">map</span> في حال ما إذا أضفنا علامة التّعجّب إلى اسم الدّالة لتصبح <span style="font-family:courier new,courier,monospace;">!map</span>. 
	</p>

	<p>
		لنستعرض المثال التّالي لتوضيح مبدأ عمل هذه الدّالّة:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3745_17">
<span class="pln">fruits = ["apples", "oranges"]
fruits.map! { |fruit| "I like " + fruit }
p fruits</span></pre>

	<p>
		يمكننا أن نرى في المثال أنّ لدينا مصفوفة من سلسلتين معيّنة للمتغيّر <span style="font-family:courier new,courier,monospace;">fruits</span>. الآن نريد أن نضيف I like قبل كلّ عنصر في هذه المصفوفة. كل ما علينا فعله هو استخدام الدّالّة <span style="font-family:courier new,courier,monospace;">map</span> والتي سوف تكرّر تنفيذ الشيفرة البرمجيّة الموجودة بداخلها على كلّ عنصر في المصفوفة. لاحظ كيف استخدمنا الحاضنات Curly Braces هذه المرّة لوضع الشيفرة البرمجيّة بينها بدلاً من <span style="font-family:courier new,courier,monospace;">do</span> و<span style="font-family:courier new,courier,monospace;">end</span>. هذه الطريقة شائعة الاستخدام إذا كانت الشيفرة البرمجيّة مكوّنة من سطر واحد وذلك يوفّر عليك وضع <span style="font-family:courier new,courier,monospace;">end</span> في سطر جديد. 
	</p>

	<p>
		لاحظ لدينا من جديد المتغيّر المؤقّت واسمه هنا <span style="font-family:courier new,courier,monospace;">fruit</span> والذي سيشير إلى كلّ عنصر موجود في المصفوفة. إذًا فلكلّ عنصر في المصفوفة سنقوم بإضافة السلسلة "I like" قبله. بعد ذلك استخدامنا دالّة<strong> </strong>+ لإضافة السلسلة الجديدة إلى العنصر الذي تُنفّذ عليه الدّالّة. 
	</p>

	<p>
		لن تطبع الدّالّة ذلك على الإطلاق فليس لدينا أمر <span style="font-family:courier new,courier,monospace;">puts</span> أو أيّ شيء يؤدّي إلى تنفيذ عمليّة الطباعة. ستقوم الدّالّة فقط باستبدال العنصر الموجود في المصفوفة بالقيمة التي تُرجعها الشيفرة البرمجيّة الموجودة في الدّالّة. إذًا فنتوقّع تغيّر قيمة المصفوفة الأصليّة إلى التّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3745_20">
<span class="pln">["I like apples", "I like oranges"]</span></pre>

	<p>
		ولاحظ كيف استخدمنا نسخة Bang للدّالّة <span style="font-family:courier new,courier,monospace;">map</span>. وذلك بإضافة علامة تعجّب أو ما يسمّى برمز Ban إلى اسم الدّالّة. فعل هذا يعني أن المصفوفة سوف تُستبدل بالكامل. إذا لم نضع علامة Bang فكانت الدّالّة ستقوم بتنفيذ الشيفرات على عناصر المصفوفة وإنشاء/إرجاع مصفوفة مؤقّتة ولكن لم تكن لتستبدل المصفوفة الأصليّة الموجودة في المتغيّر <span style="font-family:courier new,courier,monospace;">fruits</span>. 
	</p>

	<p>
		في حالتنا وحيث أنّنا استخدمنا Bang فسيتمّ تغيير المصفوفة الأصليّة وحفظها في <span style="font-family:courier new,courier,monospace;">fruits</span>. 
	</p>

	<p>
		السّطر الأخير من الشيفرات يستخدم أمر <span style="font-family:courier new,courier,monospace;">p</span> والذي يستخدم هنا لإظهار كيف أصبح المصفوفة بعد تغييرها. 
	</p>

	<p>
		يستخدم أمر <span style="font-family:courier new,courier,monospace;">p</span> غالبًا عند تنقيح الشيفرة البرمجيّة. حيث أنّه سيُظهر الكائن بدلاً من تحويله إلى سلسلة. هو مشابه جدًا لأمر <span style="font-family:courier new,courier,monospace;">puts</span>. ولكن في حين أنّ <span style="font-family:courier new,courier,monospace;">puts</span> يطبع دائمًا سلسلة على الشّاشة حيث أنّه اختصار لـ put string، فإنّ أمر <span style="font-family:courier new,courier,monospace;">p </span>يُظهر الكائن تمامًا كما هو. إذًا فإنّه في المثال أعلاه بإمكاننا باستخدام<span style="font-family:courier new,courier,monospace;"> p</span> لرؤية المصفوفة <span style="font-family:courier new,courier,monospace;">fruits</span> كمصفوفة. 
	</p>

	<p>
		جرّب تنفيذ البرنامج وألق نظرة على المصفوفة الجديدة بعد التّعديل.
	</p>
</div>

<div id="wmd-preview-section-16">
	<h2 id="خاتمة">
		خاتمة
	</h2>

	<p>
		تعرّفنا في هذا الدّرس على مفهوم الحلقات وأنواعها ويمكنك التعرّف عليها أكثر عن طريق قراءة <a href="http://ruby-doc.org/core-2.2.0/doc/syntax/control_expressions_rdoc.html" rel="external nofollow">توثيق روبي عنها</a>. تعرّفنا أيضًا على المكرّرات المستخدمة مع <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r280/" rel="">المصفوفات</a>، <a href="https://academy.hsoub.com/programming/ruby/%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D8%A7%D9%84%D8%AA%D9%82%D8%B7%D9%8A%D8%B9-hash-tables-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r282/" rel="">جداول التقطيع</a> و<a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%84%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r283/" rel="">المجالات</a>. أقترح عليك تحسين أحد البرامج المستخدمة في هذا الدّرس، مثلاً جرّب تعديل المثال المستخدم في حلقة <span style="font-family:courier new,courier,monospace;">until</span> بحيث يستقبل كلمة goodbye على أيّ هيئة ويتحقّق الشرط وتتوقف الحلقة عن التنفيذ (أعني عند كتابة المستخدم Goodbye ،GOODBYE أو GoodBye أو غير ذلك من صور الكلمة يعتبر البرنامج أنّ الشرط قد تحقّق ويوقف اللّعبة). إذا كان لديك تساؤل أو تريد مشاركتنا ما طبّقت لا تتردّد في استخدام قسم التعليقات أدناه.
	</p>
</div>
]]></description><guid isPermaLink="false">284</guid><pubDate>Mon, 29 Feb 2016 21:50:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x62C;&#x627;&#x644;&#x627;&#x62A; (Ranges) &#x641;&#x64A; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%84%D8%A7%D8%AA-ranges-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r283/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/ruby-range.png.f76a40e69866d735161fc9aa14bf8b4d.png" /></p>

<div id="wmd-preview-section-23">
	<p id="المجالات-في-روبي">
		تعرّفنا في الدّرس السّابق على <a href="https://academy.hsoub.com/programming/ruby/%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D8%A7%D9%84%D8%AA%D9%82%D8%B7%D9%8A%D8%B9-hash-tables-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r282/">جداول التّقطيع Hash</a> وكيفيّة التعامل معها والدوال الخاصّة بها. سنتعرّف في هذا الدّرس على نوع آخر من المجموعات Collections وهو المجالات Ranges. تعدّ المجالات شكلًا آخر من المصفوفات Arrays التي تحدّثنا عنها في الدّرس الخامس إلا أنّها متسلسلة على نحوٍ محدّد وأسهل بكثير من حيث الإنشاء عن المصفوفات. أمثلة على المجالات، الأعداد من 0 لـ 9، الأيّام من السبت إلى الجمعة وغيرها من الأمثلة التي تقدّم مجالات محدّدة ومتسلسلة.
	</p>

	<p style="text-align: center;">
		<img alt="ruby-range.png.e856d109ddbd3ef353d5ff405" class="ipsImage ipsImage_thumbnailed" data-fileid="12950" data-unique="egs197k31" src="https://academy.hsoub.com/uploads/monthly_2016_02/ruby-range.png.e856d109ddbd3ef353d5ff405a0c39f7.png"></p>
</div>

<div id="wmd-preview-section-24">
	<h2 id="إنشاء-مجال">
		إنشاء مجال
	</h2>

	<p>
		سنتعرّف الآن على كيفيّة إنشاء المجالات في سطر أوامر روبي التفاعليّ. يمكن استخدام المجال لتمثيل متسلسلة من القيم بترتيب معيّن. ربّما تكون قد لاحظت استخدامنا للمجالات في دروس سابقة مثلما فعلنا عند البحث عن مصفوفة جزئيّة Subset من مصفوفة أخرى في درس <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r280/">المصفوفات</a>. 
	</p>

	<p>
		أوّلاً إحدى طرق إنشاء مجال هي نفس الطريقة التي استخدمناها لإنشاء مصفوفات وجداول التّقطيع من قبل عن طريق استخدام دالّة <span style="font-family:courier new,courier,monospace;">new</span>.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3451_9">
<span class="pln">numbers = Range.new(1, 10)</span></pre>

	<p>
		انتبه إلى أنّ دالّة <span style="font-family:courier new,courier,monospace;">new</span> في حالة المجالات يجب أن تستقبل معطيات تمثّل بداية ونهاية المجال ولا يمكن إنشاء مجال فارغ مثلما كان ممكنًا إنشاء مصفوفات أو جداول تجزئة فارغة. جرّب كتابة الأمر السّابق مع عدم إعطاء روبي بداية ونهاية المجال، ماذا حدث؟ طبعت روبي رسالة خطأ Error تخبرك بأنّ عدد المعطيات خاطئة حيث أنّك زوّدت الدّالّة بلا شيء رغم انتظارها لمعطيين أو ثلاثة. المعطى الثالث <span style="font-family:courier new,courier,monospace;">exclude_end</span> وهو لإخبار روبي هل عليها تضمين نهاية المجال بالمجال أم لا. إذا لم نعطي روبي ذلك المعطى الثّالث أو كانت قيمته false فستقوم روبي بتضمين النهاية بالمجال، أمّا في حالة غير ذلك فسيتمّ عدم تضمين النهاية. 
	</p>

	<p>
		يمكنك إنشاء مجال عن طريقة الفصل بين بداية المجال ونهايتها باستخدام نقطتين كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3451_33">
<span class="pln">numbers = 1..10</span></pre>

	<p>
		سيقوم الأمر السّابق بإنشاء مجال من كلّ الأرقام الموجودة بين 1 و 10 مشتملة على 1 و 10 أيضًا وتعيينها إلى المتغيّر <span style="font-family:courier new,courier,monospace;">numbers</span>. على الجانب الآخر فإنّه إذا استخدمنا ثلاث نقاط بدلاً من اثنتين ستقوم روبي بإنشاء مجال من العناصر من 1 إلى 9 مع تجاهل 10.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3451_35">
<span class="pln">1...10</span></pre>

	<p>
		إذا فنستخدم النقطتان إذا أردنا أن يشتمل المجال على نقطة النّهاية وثلاث نقاط إذا لم نرده ذلك. يسمّى النّوع الأوّل Inclusive والثّاني Exclusive. 
	</p>

	<p>
		يمكننا أيضًا إنشاء مجال محدّد من الأحرف. فمثلاً يمكننا إنشاء مجال للأبجديّة الإنجليزيّة مكوّن من الأحرف الصغيرة Lower Case ثمّ تعيينها إلى المتغيّر <span style="font-family:courier new,courier,monospace;">alphabet</span> عن طريق كتابة الشيفرة البرمجيّة أدناه:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3451_37">
<span class="pln">alpahabet = "a".."z"</span></pre>

	<p>
		إذًا لدينا المتغيّر <span style="font-family:courier new,courier,monospace;">alphabet</span> والذين قمنا بتعيين المجال إليه. ومجالنا المحدّد هنا هو الأحرف من a إلى z مع تضمين z في المجال.
	</p>
</div>

<div id="wmd-preview-section-25">
	<h2 id="الوصول-إلى-قيم-بالمجال">
		الوصول إلى قيم بالمجال
	</h2>

	<p>
		لاحظ كيف قامت روبي في كلّ مرّة بإرجاع المجال بالشّكل التي أُنشئت عليه دون طباعة عناصر المجال. هذا هو أحد الأمور المثيرة للاهتمام حول المجالات، فمتى أردت إظهار المجال حتّى ولو باستخدام الأمر <span style="font-family:courier new,courier,monospace;">puts</span> فلن تحصل على شيء غير الهيئة التي أنشأت المجال عليها. قد تتساءل ولكن ماذا لو أردت استخدام عناصر المجال؟ للأسف لا يمكنك الوصول إلى العناصر أو القيم الموجودة في المجال مثلما كان بإمكانك مع المصفوفات والتجزئات. فمثلاً إذا أردت معرفة ما هو الحرف الموجود في الموقع الثّاني من المجال وكتبت [alphabet[2 مثلما كنت تفعل مع المصفوفة ستقوم روبي بإرجاع رسالة خط إليك. لأنّ هذه الدّالّة ليست دالّة للوصول إلى قيم مفردة في المجال. 
	</p>

	<p>
		ولكن لحسن الحظ فهناك دالّة تسمّى <span style="font-family:courier new,courier,monospace;">to_a</span> والتي تعني To Array. يمكن لهذه الدّالّة تحويل المجال الخاصّ بنا إلى مصفوفة ومن ثمّ يمكننا الوصول إلى العناصر بسهولة.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3451_25">
<span class="pln">alphabet_array = alphabet.to_a</span></pre>

	<p>
		إذًا الآن لدينا المتغيّر<span style="font-family:courier new,courier,monospace;"> alphabet_array</span> والذي سيحتوي على المصفوفة الجديدة الناتجة عن تحويل المجال <span style="font-family:courier new,courier,monospace;">alphabet</span> إلى مصفوفة باستخدام دالّة <span style="font-family:courier new,courier,monospace;">to_a</span>. 
	</p>

	<p>
		لاحظ كيف قامت روبي بإرجاع مصفوفة تحتوي على جميع الأحرف من a إلى z على هيئة عناصر من نوع سلسلة String. الآن يمكنك استخدام جميع الدوال الخاصّة بالمصفوفات والتي من بينها الوصول إلى العناصر.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3451_27">
<span class="pln">alphabet_array[2]</span></pre>

	<p>
		ستقوم روبي بعد تنفيذ هذا الأمر بإرجاع "c". هذا لأنّه كما ذكرنا سابقًا أنّ المصفوفات تقوم بالعدّ بدءًا من 0 وليس 1. إذًا فباستخدامنا 2 فإنّنا قد قمنا بالبحث عن العنصر الثالث في المصفوفة. 
	</p>

	<p>
		لمعرفة إذا كان المجال يحتوي على قيمة معيّنة أو لا يمكننا استخدام الدّالّة المنطقيّة <span style="font-family:courier new,courier,monospace;">?include</span>.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3451_29">
<span class="pln">numbers.include?(5) # true</span></pre>

	<p>
		ستقوم روبي بإرجاع true حيث أنّ المجال (قمنا بإنشائه سابقًا في البداية) يحتوي بالفعل على القيمة 5. فأنت هنا تسأل روبي هل القيمة 5 موجودة في المجال <span style="font-family:courier new,courier,monospace;">numbers</span>؟ 
	</p>

	<p>
		لمعرفة إذا كان المجال الخاصّ بنا يتضمّن نهاية المجال مع القيم أم لا يمكننا فعل ذلك عن طريق دالّة <span style="font-family:courier new,courier,monospace;">?exclude_end</span> حيث تقوم بإرجاع true إذا لم يشتمل المجال على النّهاية وfalse إذا كان العكس.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3451_31">
<span class="pln">numbers.exclude_end?</span></pre>

	<h2>
		استخدامات المجالات
	</h2>
</div>

<div id="wmd-preview-section-26">
	<p>
		تستخدم المجالات في كثير من الأحيان في المقارنة أو التكرار. مثال على المقارنة، التحقّق من وجود قيمة معيّنة في مجال محدّد من القيم.
	</p>

	<p>
		مثال على التكرار، تنفيذ حلقة Loop لفعل أمر ما 10 مرّات. يمكن إنشاء مجال باستخدام أيّ نوع من البيانات ولكن في أغلب الأحيان ستجد نفسك تستخدم المجالات من نوع السلاسل أو الأرقام فقط. السبب وراء ذلك هو قدرة روبي على ترتيب القيم في هذين النّوعين. فمثلاً، من السّهل إنشاء مجال 1 إلى 10، التحقّق من ما إذا كانت قيمة معيّنة موجودة في هذا المجال وأيضًا من السّهل طباعة كلّ رقم في المجال. الأمر ذاته مشابه مع السلاسل. 
	</p>

	<p>
		تعرّفنا سابقًا أنّه بإمكاننا إنشاء مجال من الأرقام الصحيحة Integer من 0 إلى 10. الأمر الجيّد أيضًا أنّه بإمكاننا إنشاء مجالات من الأعداد العشريّة Float فمثلاً لو أردنا إنشاء مجال لنظام المعدّل التراكمي GPA فيمكننا إنشاؤه كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3451_21">
<span class="pln">gpa = 0.0..4.0</span></pre>

	<p>
		الآن إذا أردنا معرفة إذا كانت قيمة عشريّة معيّنة موجودة في هذا المجال أو لا (لنفرض مثلاً 2.5) فيمكننا فعل ذلك باستخدام دالّة <span style="font-family:courier new,courier,monospace;">?include</span> كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3451_23">
<span class="pln">gpa.include?(2.5)</span></pre>

	<h2>
		تطبيق عملي
	</h2>
</div>

<div id="wmd-preview-section-27">
	<p>
		لا يبدو مثال المعدّل التراكمي السّابق مفيدًا كثيرًا، أليس كذلك؟ يمكننا جعله أكثر إفادة بتحديد مجال من 0 إلى 2 بحيث يكون هذا المجال هو مجال الإنذار كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3451_16">
<span class="pln">gpa_warning = 0.0..2.0</span></pre>

	<p>
		الآن لنطبّق ما تعلّمناه في درس <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r274/">العبارات الشرطيّة</a> يمكننا إنشاء برنامج لاستقبال المعدّل التراكمي للطالب ومن ثمّ معالجة البيانات وطباعة معلومات عنها. افتح ملفًّا جديدًا واحفظه باسم <span style="font-family:courier new,courier,monospace;">gpa.rb </span>أو أيّ اسم من اختيارك مع التأكّد من وجود <span style="font-family:courier new,courier,monospace;">rb.</span> في نهاية اسم الملفّ. 
	</p>

	<p>
		لنبدأ أوّلاً بطباعة التعليمات الخاصّة بالبرنامج، سنطلب من المستخدم إدخال المعدّل التراكمي الخاصّ به واستقبال المعدّل التراكمي كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3451_19">
<span class="pln">gpa_warning = 0.0...2.0

puts "Please Enter your GPA (0.0 to 4.0)"
gpa_entry = gets.to_f</span></pre>

	<p>
		في السّطر الأوّل قمنا بتعريف متغيّر باسم <span style="font-family:courier new,courier,monospace;">gpa_warning </span>وقمنا بتعيين المجال 0 إلى 2 إليه، حيث هذا المجال هو مجال التنبيه لأيّ طالب حاصل على معدّل تراكمي بين 0 و2. 
	</p>

	<p>
		بعد ذلك في السطر الثّاني طبعنا رسالة على الشّاشة تسأل المستخدم أن يدخل قيمة المعدّل التراكمي الخاصّ به بين 0 و 4. 
	</p>

	<p>
		في السطر الثّالث أنشأنا متغيّر باسم <span style="font-family:courier new,courier,monospace;">gpa_entery </span>وهو المتغيّر الذي ستقوم روبي بحفظ القيمة التي سيدخلها المستخدم إلى البرنامج به. أمر <span style="font-family:courier new,courier,monospace;">gets</span> يتيح للمستخدم إدخال بيانات، دالّة <span style="font-family:courier new,courier,monospace;">to_f</span> تستخدم لتحويل المُدخلات Inputs من سلاسل إلى أرقام عشريّة، حيث أنّ أيّ مدخل يتمّ اعتباره افتراضيًّا أنّه سلسلة (اسم الدّالّة نفسها هو اختصار لـ get string). 
	</p>

	<p>
		قد تتساءل هنا، لماذا لم نضِف دالّة <span style="font-family:courier new,courier,monospace;">chomp</span> إلى <span style="font-family:courier new,courier,monospace;">gets</span> لحذف السطر الذي تضيفه روبي إلى المدخل عند الضغط على Enter؟ الإجابة هي أنّ السطر الزائد يتمّ حذفه بالفعل عند تحويل المُدخل إلى عدد عشري. 
	</p>

	<p>
		الآن لدينا ما نحتاج للحصول على مُدخل من المستخدم. الجزء الثّاني من البرنامج هو أن نقوم بالتعامل مع هذه البيانات بحيث تقوم بطباعة شيء محدّد بناءً على ما يدخله المستخدم.
	</p>

	<pre class="ipsCode" id="ips_uid_3451_14">
if (gpa_entry &lt; 0.0 || gpa_entry &gt; 4.0)
    puts "False entery. Please enter a numberic value between 0 and 4."

elsif (gpa_warning.include?(gpa_entry))
    puts "Your GPA is too low! You need to do something about it."

else
    puts "Congratulations! Your GPA is good. No warnings."
end</pre>

	<p>
		ماذا فعلنا هنا؟ أوّلاً، عبارة <span style="font-family:courier new,courier,monospace;">if</span> الأولى تقوم بالتحقّق إذا كان ما أدخله المستخدم أصغر من 0 أو أكبر من 4 وهذه حالات غير متوقّعة في المعدّل التراكمي. إذا كان المُدخل يحقّق أحد الشرطين سيقوم البرنامج بإخبار المستخدم أنّ عليه إدخال رقم ما بين 0 و 4. 
	</p>

	<p>
		عبارة <span style="font-family:courier new,courier,monospace;">elsif</span> تتحقّق هل يحتوي المجال الموجود في المتغيّر <span style="font-family:courier new,courier,monospace;">gpa_warning</span> على قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">gpa_entery</span> والذي هو القيمة التي أدخلها المستخدم. إذا تحقّق شرط العبارة فهذا يعني أن المعدّل التراكمي الذي تمّ إدخاله سيكون بين 0 و2 وفي هذه الحالّة سيقوم البرنامج بطباعة رسالة التنبيه للمستخدم. 
	</p>

	<p>
		في حالة إذا كان المعدّل التراكمي غير ذلك، أي أنّه ليس أقل من 0 أو أكبر من 4. وأيضًا ليس بين 0 و2 فسيقوم البرنامج بإخبار المستخدم أنّ معدّله التراكمي جيّد وأنّه لا توجد أيّ تنبيهات له. 
	</p>

	<p>
		الآن إذا قمت بتجربة البرنامج ستجده يعمل بشكلٍ جيّد ولكن ماذا يحدث عندما تُدخل سلسلة نصيّة؟ يقوم البرنامج بطباعة رسالة التنبيه بأنّ المعدّل التراكمي منخفض، أعلم أنّك لم تتوقّع ذلك. تقوم دالّة <span style="font-family:courier new,courier,monospace;">t_f</span> بتحويل ما نستدعيها عليه إلى عدد عشري وإذا كان المُدخل هو نصّ عادي فتقوم بتحويل قيمته إلى 0.0 وهي القيمة الموجودة لدينا بالفعل في المجال. 
	</p>

	<p>
		والآن حان دورك، هل يمكنك حلّ هذه المشكلة بحيث أنّه عند إدخال المستخدم أحرفًا وقيمًا ليست بالأرقام يطبع له البرنامج أنّ عليه إدخال أرقام؟
	</p>
</div>

<div id="wmd-preview-section-28">
	<h2 id="خاتمة">
		خاتمة
	</h2>

	<p>
		تعرّفنا في هذا الدّرس والدّروس الماضية على أنواع المجموعات المختلفة في روبي مثل <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r280/">المصفوفات</a>، <a href="https://academy.hsoub.com/programming/ruby/%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D8%A7%D9%84%D8%AA%D9%82%D8%B7%D9%8A%D8%B9-hash-tables-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r282/">جداول التّقطيع</a> والمجالات. يمكنك <a href="http://ruby-doc.org/core-2.2.0/Range.html" rel="external nofollow">قراءة توثيق روبي حول المجالات</a> لمعرفة المزيد عنها. جرّب تحسين البرنامج الموجود بقسم التطبيق العملي بأن يقوم بطباعة بيانات أخرى حول المعدّل التراكمي بناءً على إدخال المستخدم وموقع هذا المعدّل بالنسبة للمجال المحدّد. إذا كنت تودّ إضافة معلومة عن المجالات أو واجهتك مشاكل أو لديك تساؤل حول الدّرس فلا تتردّد في السؤال بقسم التعليقات أدناه.
	</p>
</div>
]]></description><guid isPermaLink="false">283</guid><pubDate>Fri, 19 Feb 2016 09:58:00 +0000</pubDate></item><item><title>&#x62C;&#x62F;&#x627;&#x648;&#x644; &#x627;&#x644;&#x62A;&#x642;&#x637;&#x64A;&#x639; Hash tables &#x641;&#x64A; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D8%A7%D9%84%D8%AA%D9%82%D8%B7%D9%8A%D8%B9-hash-tables-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r282/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/ruby-hash-tables.png.695a43d7c682965115dae4cb42fb8661.png" /></p>

<div id="wmd-preview-section-15">
	<p id="جداول-التقطيع-hash-tables-في-روبي">
		جدول التّقطيع Hash هي بنية بيانات Data Structure مشابهة إلى حد كبير للمصفوفات التي تحدّثنا عنها في <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r280/" rel="">الدّرس السّابق</a> (حتّى أنّ جداول التّقطيع تسمّى في بعض اللُّغات الأخرى Associative Arrays). يندرج الاثنان تحت ما يسمّى بالمجموعات Collections. يتيح لنا النوعان حفظ بيانات مختلفة مرّة واحدة دون الحاجة إلى استخدام الكثير من المتغيّرات لحفظها. إلا أنّ جداول التّقطيع تختلف عن المصفوفات بعض الشيء. فمثلاً يمكننا الإشارة إلى عنصر في المصفوفة عن طريق مكان هذا العنصر أو ما يسمّى بالدليل Index، أمّا بالنسبة لجدول التّقطيع فنستخدم معرّفًا Identifier للإشارة إلى العنصر الذي نريد الوصول إليه.
	</p>

	<p style="text-align: center;">
		<img alt="ruby-hash-tables.png" class="ipsImage ipsImage_thumbnailed" data-fileid="12949" data-unique="iaicusvn2" src="https://academy.hsoub.com/uploads/monthly_2016_02/ruby-hash-tables.png.87b481b69f1b4aa4c7ccf45bdd464cc3.png"></p>

	<p>
		يمكن اعتبار جداول التّقطيع على أنّها قوائم مكوّنة من أزواج مفاتيح Key وقيمة Value. يمكن للمعرّف أو المفتاح أن يكون أي نوع من أنواع بيانات روبي التي تعرّفنا عليها في الدروس السّابقة. ولكن أكثر الأنواع المستخدمة شيوعًا هو <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D9%88%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r254/" rel="">السلاسل</a>، <a href="https://academy.hsoub.com/programming/ruby/%D9%83%D9%8A%D9%81-%D8%AA%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r270/" rel="">الأرقام</a> و <a href="http://ruby-doc.org/core-2.2.0/Symbol.html" rel="external nofollow">الرموز</a> Symbols (هذا الأخير هو أكثرها شيوعًا على الإطلاق). سنتعرّف في هذا الدّرس على كيفيّة إنشاء والتّعامل مع جداول التّقطيع.
	</p>
</div>

<div id="wmd-preview-section-16">
	<h2 id="إنشاء-جدول-التقطيع">
		إنشاء جدول التقطيع
	</h2>

	<p>
		لنبدأ العمل مع جداول التّقطيع الآن، ابدأ جلسة روبي جديدة في سطر أوامر روبي التفاعليّ عن طريق كتابة أمر <span style="font-family:courier new,courier,monospace;">irb</span> في الطرفيّة.
	</p>

	<p>
		عمليّة إنشاء جدول التّقطيع تشبه نوعًا ما عمليّة إنشاء مصفوفة. هناك طرق مختلفة لإنشاء جدول تقطيع. يمكن تهيئة Instantiate جدول تقطيع باستخدام الحاضنات Curly Braces أو تهيئة نسخة من صنف Hash. 
	</p>

	<p>
		لنتعرّف أوّلاً على الطريقة الأولى. وهي عبارة عن إنشاء جدول تقطيع فارغ ومن ثمّ إضافة عناصر إليه فيما بعد. فمثلاً إذا أردنا إنشاء جدول تقطيع فارغ وتعيينه إلى متغيّر اسمه <span style="font-family:courier new,courier,monospace;">myHash</span> نفعل ذلك كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_11">
<span class="pln">myHash = Hash.new</span></pre>

	<p>
		تأكّد من كتابة Hash بحرف كبير. 
	</p>

	<p>
		هناك طريقة أقصر من ذلك أيضًا وذلك بتعيين حاضنات فارغة للمتغيّر هكذا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_19">
<span class="pln">myHash = {}</span></pre>

	<p>
		بعد الضغط على Enter في الحالتين ستجد أن روبي قد قامت بإرجاع حاضنات فارغة معلنةً عن إنشاء جدول تقطيع فارغ. ولكن ماذا سنفعل بجدول تقطيع فارغ على كل حال؟ جدول تقطيع فارغ ليس بالشيء المفيد على الإطلاق. 
	</p>

	<p>
		الآن لو أردنا إنشاء جدول تقطيع باستخدام الحاضنات وتعيينه إلى متغيّر اسمه <span style="font-family:courier new,courier,monospace;">marge</span> ثم بداخل جدول التّقطيع قمنا بإضافة العناصر المتكوّنة من مفتاح وقيمة. نفعل ذلك هكذا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_21">
<span class="pln">marge = { :name =&gt; "Marge Simpson" }</span></pre>

	<p>
		ماذا فعلنا هنا؟ أنشأنا متغيّرًا باسم <span style="font-family:courier new,courier,monospace;">marge</span> وقمنا بتعيين قيمة جدول التّقطيع الذي أنشأناها في الطرف الأيمن لذلك المتغيّر. وضعنا بجدول التّقطيع عنصرًا واحدًا مكوّنًا من المفتاح <span style="font-family:courier new,courier,monospace;">name:</span> والذي هو من نوع Symbol (عرّفنا النّوع عن طريق النقطتين Colon الموجودتان قبله) والقيمة التي هي عبارة عن سلسلة، قمنا بتعيين القيمة إلى المفتاح عن طريقة ما يسمّى بسهم جدول التّقطيع Hash Rocket (<strong>&lt;=</strong>). يعدّ استخدام الرموز (ٍSymbol) كمفاتيح في جداول التّقطيع مثلما فعلنا في المثال السّابق أمرًا شائعًا جدًا في روبي. قد تتساءل عن السبب؟ السبب الرئيسي هو أنّ الرموز تستخدم الذّاكرة بطريقة أفضل وأكثر إفادة بكثير من السلاسل مثلاً. 
	</p>

	<p>
		هناك طريقة أخرى مختصرة لإنشاء جداول التّقطيع ولتوضيح الطريقة سنقوم بإنشاء جدول تقطيع جديد ونعيّنه إلى المتغيّر <span style="font-family:courier new,courier,monospace;">homer</span> كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_36">
<span class="pln">homer = { name: "Homer Simpson" }</span></pre>

	<p>
		هل لاحظت الفرق بين هذه الطّريقة والسّابقة؟ لا تختلف هذه الطريقة كثيرًا عن السّابقة، فقط حذفنا سهم جدول التّقطيع ونقلنا النقطتين لتصبحا بين المفتاح والقيمة. لا زال المفتاح رمزًا كما هو لم يتغيّر نوعه. لاحظ عند الضّغط على Enter ستقوم روبي بإرجاع جدول تقطيع بالصورة الافتراضيّة لها (باستخدام سهم جدول التّقطيع ) رغم استخدامنا للطريقة المختصرة، كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_38">
<span class="pln">{:name =&gt; "Homer Simpson"}</span></pre>

	<p>
		يمكننا إنشاء جدول تقطيع يحتوي على أكثر من زوج مفتاح/قيمة. مثلاً لنعد إنشاء جدول التّقطيع <span style="font-family:courier new,courier,monospace;">homer</span> من جديد هكذا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_40">
<span class="pln">homer = { name: "Homer Simpson", job: "Nuclear Safety Inspector", children: ["Bart", "Lisa", "Maggie"] }</span></pre>

	<p>
		كما تلاحظ يمكننا استخدام أنواع مختلفة من الكائنات كعناصر في جدول التّقطيع . لسنا مضطرّين لاستخدام السلاسل فقط. فدلينا في المثال السّابق قيم العنصرين <span style="font-family:courier new,courier,monospace;">name</span> و <span style="font-family:courier new,courier,monospace;">job</span> من نوع سلسلة والعنصر الثالث الذي يحتوي على مفتاح <span style="font-family:courier new,courier,monospace;">children</span> قيمته من نوع مصفوفة مكوّنة من ثلاثة عناصر.
	</p>
</div>

<div id="wmd-preview-section-17">
	<h2 id="التعامل-مع-جداول-التقطيع">
		التعامل مع جداول التقطيع
	</h2>

	<p>
		إذا أردنا التحقّق إذا كان هناك مفتاح معيّن موجود في جدول التّقطيع أم لا يمكننا فعل ذلك باستخدام دالّة <span style="font-family:courier new,courier,monospace;">include</span>. فمثلاً إذا أردنا معرفة إذا كان لدى <span style="font-family:courier new,courier,monospace;">homer</span> وظيفة يمكننا التحقّق كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_42">
<span class="pln">homer.include?(:job)</span></pre>

	<p>
		إذًا فقد استخدمنا اسم جدول التّقطيع أو المتغيّر الذي قمنا بتعيين جدول تقطيع له، ثم لدينا استدعاء دالّة <span style="font-family:courier new,courier,monospace;">include</span>، وحيث كما ذكرنا في الدروس السّابقة أنّ <span style="font-family:courier new,courier,monospace;">include</span> دالّة منطقيّة Boolean Method والدوال المنطقيّة تنتهي بعلامة استفهام لأن ناتج استدعائها true أو false (باختصار هي كأن تسأل مثلاً، هل لهومر وظيفة؟ لن تجد إطلاقًا إجابة غير نعم أو لا). إذًا ناتج هذا الأمر السّابق سيكون true إذا وجدت روبي قيمة للمفتاح <span style="font-family:courier new,courier,monospace;">job</span> أو false إذا لم تجد. وبالنّظر إلى جدول التّقطيع التي لدينا فنتوقّع إجابة روبي بـ true حيث أنّه موجود وظيفة (المفتاح <span style="font-family:courier new,courier,monospace;">job</span>) لـ <span style="font-family:courier new,courier,monospace;">homer</span> بالفعل في جدول التّقطيع . 
	</p>

	<p>
		إذًا نحن نعرف أنّ العنصر موجود، الآن نريد معرفة كيف يمكننا استخدام هذه القيمة (سواء لطباعتها على الشّاشة أو لو استخدامها في عمليّات أخرى). للوصول إلى القيمة الفعليّة بدلاً من التحقّق من وجودها فقط ولمعرفة أن هذه القيمة خاصّة بالمفتاح المحدّد كل ما نفعله هو استخدام المفتاح بطريقة مشابهة جدًا لتلك التي استخدمناها مع الدليل Index في المصفوفات. إذًا إذا أردنا معرفة وظيفة <span style="font-family:courier new,courier,monospace;">homer</span> يمكننا فعل ذلك كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_44">
<span class="pln">homer[:job]</span></pre>

	<p>
		إذًا كلّ ما فعلناه أعلاه هو كتابة اسم جدول التّقطيع واسم المفتاح بين قوسين مربّعين. بعد تنفيذ الأمر سترجع لك روبي الوظيفة. 
	</p>

	<p>
		لكن ماذا لو استدعينا مفتاحًا ليس موجودًا في جدول التّقطيع أصلاً؟ مثلاً لو أردنا معرفة عمر <span style="font-family:courier new,courier,monospace;">homer</span> باستخدام مفتاح <span style="font-family:courier new,courier,monospace;">age:</span>. لم نقم بحفظ قيمة كهذه في جدول التّقطيع لذلك إذا استدعيناها فلن ترجع روبي شيئًا غير nil. ولكن ماذا تعني nil؟ nil هو كائن في روبي يمثّل اللاشيء إذا أردت تعريفه كذلك. متى أخفقت دالّة بإرجاع قيمة مفيدة أو ذات معنى فإنّها تقوم بإرجاع nil. 
	</p>

	<p>
		إذا أردنا معرفة عدد القيم الموجودة في جدول تقطيع يمكننا استخدام دالّة <span style="font-family:courier new,courier,monospace;">length</span>. جرّب تنفيذ الأمر التالي وستحصل على طول جدول التّقطيع الخاصّة بك:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_46">
<span class="pln">homer.length</span></pre>

	<p>
		قد تحتاج إلى إضافة قيم جديدة إلى جدول التّقطيع (فارغة كانت أو تحتوي على عناصر) بعد إنشائها، يمكنك فعل ذلك عن طريقة كتابة اسم المفتاح الجديد وجعله مساويًا للقيمة التي تريد تعيينها إلى ذلك المفتاح. فمثلاً إذا أردنا إضافة مفتاح <span style="font-family:courier new,courier,monospace;">age</span> إلى <span style="font-family:courier new,courier,monospace;">homer</span> والذي أخبرتنا روبي أعلاه بأنّه ليس موجودًا في جدول التّقطيع عن طريقة إرجاعها nil. فيمكننا فعل ذلك كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_48">
<span class="pln">homer[:age] = 38</span></pre>

	<p>
		الآن للتأكّد من أن العنصر قد تمّت إضافته فإنّ كلّ ما علينا فعله هو كتابة اسم جدول التّقطيع (<span style="font-family:courier new,courier,monospace;">homer</span> في هذه الحالة) والضغط على Enter. ستجد أنّ المفتاح <span style="font-family:courier new,courier,monospace;">age</span> وقيمته موجودين بنهاية جدول التّقطيع . والآن أيضًا يمكنك سؤال روبي عن قيمة المفتاح <span style="font-family:courier new,courier,monospace;">age</span> وتوقّع ظهور قيمة بدلاً من اللاقيمة nil. 
	</p>

	<p>
		يمكن أيضًا إضافة جدول تقطيع ليكون أحد القيم في جدول تقطيع آخر. مثلاً إذا أردنا إضافة بيانات زوجة <span style="font-family:courier new,courier,monospace;">homer</span> إلى جدول التّقطيع الخاصّ به ولدينا فعلاً جدول تقطيع باسم زوجته <span style="font-family:courier new,courier,monospace;">marge</span> فيمكننا فعل ذلك كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_50">
<span class="pln">homer[:wife] = marge</span></pre>

	<p>
		ماذا حدث؟ قمنا هنا بتعيين جدول التّقطيع الموجودة بالمتغيّر <span style="font-family:courier new,courier,monospace;">marge</span> إلى المفتاح الجديد <span style="font-family:courier new,courier,monospace;">wife</span> المضاف إلى جدول التّقطيع <span style="font-family:courier new,courier,monospace;">homer</span>. بعد كتابة هذا والضّغط على Enter ستجد أنّ روبي قد أعادت القيمة الموجودة في <span style="font-family:courier new,courier,monospace;">marge</span> وهي جدول تقطيع مكوّنة من عنصر واحد.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_52">
<span class="pln">{:name =&gt; "Marge Simpson"}</span></pre>

	<p>
		هل توقّعت أن يكون الأمر أكثر صعوبة؟ لا تتوقع أن تواجه صعوبة في روبي لحسن الحظّ. 
	</p>

	<p>
		الآن إذا أردنا النظر في جدول تقطيع <span style="font-family:courier new,courier,monospace;">homer</span> ستجد أنّ جدول التّقطيع قد أضيف. ما فعلناه هنا هو أنّنا قمنا بإنشاء جدول تقطيع متداخل Nested Hash، بمعنى أنّ لدينا جدول تقطيع داخل جدول تقطيع آخر. 
	</p>

	<p>
		الآن إذا أردنا الوصول إلى قيمة جدول تقطيع المتداخل نفعل ذلك عن طريق استدعاء كل مفتاح بالترتيب بدءًا من جدول التّقطيع المحتوي على الآخر. فمثلاً إذا أردت معرفة اسم زوجة هومر فنستدعي المفتاح <span style="font-family:courier new,courier,monospace;">wife</span> كما تعوّدنا ولكن نضيف إلى ذلك المفتاح أيضًا مفتاح <span style="font-family:courier new,courier,monospace;">name</span> الموجود في جدول تقطيع <span style="font-family:courier new,courier,monospace;">marge</span> كالتّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_54">
<span class="pln">homer[:wife][:name]</span></pre>

	<p>
		إذًا فالمفتاح الأوّل هو الموجود بجدول تقطيع <span style="font-family:courier new,courier,monospace;">homer</span> والمفتاح الثّاني هو الموجود في جدول تقطيع <span style="font-family:courier new,courier,monospace;">marge</span>. بالضغط على Enter ستقوم روبي بإرجاع القيمة الموجودة في المفتاح <span style="font-family:courier new,courier,monospace;">name</span> الموجود في <span style="font-family:courier new,courier,monospace;">marge</span> وليس <span style="font-family:courier new,courier,monospace;">homer</span>، لا تنس ذلك.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_56">
<span class="pln">"Marge Simpson"</span></pre>

	<h2>
		دوال جداول التقطيع
	</h2>
</div>

<div id="wmd-preview-section-18">
	<p>
		الكثير من الدوال الخاصّة بجداول التّقطيع هي نفسها الخاصّة بالمصفوفات تعرّفنا على اثنين منها (<span style="font-family:courier new,courier,monospace;">include</span> و <span style="font-family:courier new,courier,monospace;">length</span>). 
	</p>

	<p>
		لحذف عنصر في جدول تقطيع نستخدم دالّة <span style="font-family:courier new,courier,monospace;">delete</span> والتي تستقبل مفتاح العنصر المراد حذف كمعطى. تقوم الدّالة أيضًا بإرجاع القيمة التي تمّ حذفها.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_24">
<span class="pln">homer.delete(:age)  # 38</span></pre>

	<p>
		لحذف أوّل عنصر في جدول تقطيع نستخدم دالّة <span style="font-family:courier new,courier,monospace;">shift</span> والتي تحذف أوّل زوج مفتاح/قيمة بجدول تقطيع وتقوم بإرجاعهما في مصفوفة.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_26">
<span class="pln">homer.shift # [:name, "Homer Simpson"]</span></pre>

	<h3>
		الدوال الخاصة بجداول التقطيع فقط
	</h3>
</div>

<div id="wmd-preview-section-19">
	<p>
		رغم ذكرنا سابقًا أنّ دوال جداول التّقطيع تشبه دوال المصفوفات إلا أن جداول التّقطيع تختصّ ببعض الدوال عن المصفوفات نظرًا لاحتوائها على مفاتيح وقيم. فمثلاً دالّة <span style="font-family:courier new,courier,monospace;">keys</span> تقوم بإرجاع مصفوفة بها جميع المفاتيح الموجودة بجدول تقطيع .
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_28">
<span class="pln">homer.keys  # [:job, :children, :wife]</span></pre>

	<p>
		دالّة <span style="font-family:courier new,courier,monospace;">values</span> تقوم بإرجاع مصفوفة تحتوي على جميع القيم الموجودة في جدول تقطيع .
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_30">
<span class="pln">homer.values    # ["Nuclear Safety Inspector", ["Bart", "Lisa", "Maggie"], { :name =&gt; "Marge Simpson" }]</span></pre>

	<p>
		لمعرفة إذا كانت قيمة معيّنة موجودة في جدول تقطيع يمكننا استخدام دالّة <span style="font-family:courier new,courier,monospace;">?has_value</span> أو اختصارها <span style="font-family:courier new,courier,monospace;">?value</span>.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_32">
<span class="pln">homer.value?("Homer Simpson")   # false</span></pre>

	<p>
		قد تتساءل لماذا قامت روبي بإرجاع false رغم إنشائنا للمفتاح في البداية؟ دعني أُذكّرك أنّه قد تمّ حذف العنصر باستخدام دالّة <span style="font-family:courier new,courier,monospace;">shift</span> أعلاه. 
	</p>

	<p>
		لمعرفة إذا كان مفتاح معيّن موجود في جدول تقطيع أم لا يمكننا استخدام دالّة <span style="font-family:courier new,courier,monospace;">?has_key</span> أو اختصارها <span style="font-family:courier new,courier,monospace;">?key</span>.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3261_34">
<span class="pln">homer.key?(:job)    # true</span></pre>

	<h2>
		خاتمة
	</h2>
</div>

<div id="wmd-preview-section-20">
	<p>
		تعرّفنا في هذا الدّرس على جداول التّقطيع، كيفيّة إنشائها وكيفيّة التعامل معها وإضافة عناصر إليها وبعض الدوال الخاصّة بها. حان دورك للتطبيق على ما تعلّمت. يمكنك معرفة المزيد عن جداول التّقطيع عن طريق قراءة <a href="http://docs.ruby-lang.org/en/2.0.0/Hash.html" rel="external nofollow">توثيق روبي</a>. ربما تريد الآن تحسين قائمة المشتريات (التي استخدمناها كمصفوفة في <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r280/" rel="">الدّرس السّابق</a>) عن طريق وضعها في جدول تقطيع بدلاً من مصفوفة. إذا استعصى عليك أمر أو لديك سؤال لا تتردّد في طرحه في قسم التعليقات أدناه.
	</p>
</div>
]]></description><guid isPermaLink="false">282</guid><pubDate>Mon, 15 Feb 2016 12:14:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x635;&#x641;&#x648;&#x641;&#x627;&#x62A; (Arrays) &#x641;&#x64A; &#x631;&#x648;&#x628;&#x64A;</title><link>https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-arrays-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r280/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/ruby-arrays.png.f4f88975fd9d86b9f13b19c2f455ba48.png" /></p>

<div id="wmd-preview-section-15">
	<p id="المصفوفات-في-روبي">
		بعض أنواع البيانات التي تحدّثنا عنها في الدروس السّابقة هي <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D9%88%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r254/">السلاسل</a> و <a href="https://academy.hsoub.com/programming/ruby/%D9%83%D9%8A%D9%81-%D8%AA%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r270/">الأرقام</a>. تتيح لنا السلاسل إمكانيّة التعامل مع النصوص الخاصّة ببرنامجنا والأرقام تمكننا من التعامل مع البيانات الرقميّة.
	</p>

	<p style="text-align: center;">
		<img alt="ruby-arrays.png.70722885626a17ec4bb5cedc" class="ipsImage ipsImage_thumbnailed" data-fileid="12852" data-unique="gk9uxhndb" src="https://academy.hsoub.com/uploads/monthly_2016_02/ruby-arrays.png.70722885626a17ec4bb5cedc46b1c1d7.png"></p>

	<p>
		لنفترض مثلاً أنّنا نريد إنشاء قائمة مشتريات، بداخل تلك القائمة لدينا أسماء المشتريات. يمكننا إنشاء تلك القائمة على شكل سلسلة String مفصول بين كل عنصر فيها بفاصلة. أو يمكننا استخدام ثلاثة سلاسل محفوظة بمتغيّرات مسمّاة item1, item2 وهكذا. ولكن لحسن الحظّ فإنّ روبي تُوفّر لنا نوعًا يمكنه التعامل مع هذا النّوع من البيانات فعلاً يسمّى بالمصفوفة Array. المصفوفة هي عبارة عن حاوية للبيانات. تُستخدم المصفوفات لتخزين أنواع مختلفة من البيانات مثل السلاسل، الأرقام وأيّ نوع آخر من كائنات روبي. سنتعرّف في هذا الدّرس على كيفيّة إنشاء المصفوفات والتّعامل معها في روبي.
	</p>
</div>

<div id="wmd-preview-section-16">
	<h2 id="إنشاء-مصفوفة">
		إنشاء مصفوفة
	</h2>

	<p>
		سنستخدم سطر أوامر  روبي التفاعليّ الآن للتعرّف على المصفوفات. ابدأ جلسة روبي في الطرفيّة عن طريق كتابة <span style="font-family:courier new,courier,monospace;">irb</span> والضّغط على Enter. 
	</p>

	<p>
		يمكن إنشاء مصفوفة حرفيّة Array Literal عن طريق وضع الكائنات داخل أقواس مربّعة Square Brackets مفصول بينها بفاصلة. كالمثال أدناه، أنشأنا قائمة من الأعداد الأوّليّة:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_9">
<span class="pln">[2, 3, 5, 7]</span></pre>

	<p>
		لا تشترط المصفوفات بأن تقوم بتخزين أرقام فقط بها. يمكنك أيضًا إنشاء مصفوفة مكوّنة من سلاسل هكذا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_11">
<span class="pln">["apples", "oranges"]</span></pre>

	<p>
		هناك أيضًا طريقة أقصر لإنشاء مصفوفة من السلاسل. نبدأ ذلك بكتابة علامة النّسبة المئويّة متبوعة بحرف w ثمّ بعد ذلك يمكنك الاختيار إذا كنت تريد استخدام الأقواس Parentheses أو الحاضنات Curly Brackets لبدء المصفوفة، الأمر الإيجابي حول هذه الطريقة هو أنّه باستخدامها لن تصبح في حاجة إلى وضع كل سلسلة بين علامات اقتباس وأيضًا لن تحتاج إلى الفصل بين عناصر المصفوفة باستخدام الفاصلة، استخدام المسافات يفي بالغرض.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_13">
<span class="pln">%w(apples, oranges)
%w{apples oranges}</span></pre>

	<p>
		عند كتابة المصفوفة بأحد الطريقتين أعلاه والضّغط على Enter ستلاحظ أنّ روبي ستضعها في الصّورة الافتراضيّة للمصفوفة، أقواس مربّعة ومفصول بين السلاسل بفاصلة. 
	</p>

	<p>
		ليس مفروضًا عليك استخدام كائنات من نوع بيانات واحد في المصفوفة فيمكنك إنشاء مصفوفة تحتوي على أكثر من نوع من العناصر، كما تلاحظ في المثال أدناه فقد أنشأنا مصفوفة تحتوي على عدد صحيح Integer، سلسلة وعدد عشري Float:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_15">
<span class="pln">[1, "two", 3.0]</span></pre>

	<p>
		هناك طريقة أخرى لإنشاء مصفوفة وذلك باستخدام دالّة <span style="font-family:courier new,courier,monospace;">new</span> كالتالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_17">
<span class="pln">fruits = Array.new</span></pre>

	<p>
		ما فعلناه هنا هو إنشاء متغيّر باسم <span style="font-family:courier new,courier,monospace;">fruits</span> وتعيين مصفوفة جديدة فارغة إلى ذلك المتغيّر باستخدام دالّة <span style="font-family:courier new,courier,monospace;">new</span>. 
	</p>

	<p>
		قد تتساءل، إذا كان بالإمكان تعيين مصفوفة إلى متغيّر فهل يمكن استخدام متغيّر كعنصر في مصفوفة؟ نعم يمكن ذلك ويكون نوع العنصر هو نوع البيانات الموجودة في المتغيّر، جرّب إنشاء متغيّر ثم ضعه في المصفوفة كعنصر كما فعلت سابقًا مع السلاسل، تسمّى هذه العمليّة بالاستيفاء Code Interpolation.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_19">
<span class="pln">item = "apples"
fruits = %W(#{item} oranges)</span></pre>

	<p>
		لاحظ أنّنا استخدمنا حرف W كبير بدلاً من الصّغير الذي استخدمناه سابقًا.
	</p>
</div>

<div id="wmd-preview-section-17">
	<h2 id="المصفوفات-متعددة-الأبعاد">
		المصفوفات متعددة الأبعاد
	</h2>

	<p>
		يمكنك إنشاء مصفوفة تحتوي على مصفوفات أخرى بداخلها، تسمّى بالمصفوفة متعدّدة الأبعاد Multidimensional Array. يعد هذا النوع من المصفوفات مفيدًا لإنشاء مستوى إحداثيّات. يمكن إنشاء مصفوفة متعدّدة الأبعاد هكذا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_21">
<span class="pln">[[1, 3], [5, 7]]</span></pre>

	<h2>
		الوصول إلى عنصر أو عدة عناصر بالمصفوفة
	</h2>
</div>

<div id="wmd-preview-section-18">
	<p>
		تعدّ المصفوفات أحد أدوات روبي المهمّة. وتمتلك المصفوفات بعض الدوال المفيدة للوصول إلى عنصر معيّن بها. للتعرف على بعض تلك الدوال سنقوم بإنشاء مصفوفة بقائمة المشتريات تحتوي على 5 عناصر. لنقم بإنشاء متغيّر باسم <span style="font-family:courier new,courier,monospace;">list</span> وتعيين المصفوفة التي نريد إلى ذلك المتغيّر.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_23">
<span class="pln">list = %w(apples oranges milk bread sugar)</span></pre>

	<p>
		للوصول إلى قيمة معيّنة في المصفوفة نكتب مكان وجود هذه القيمة في أقواس مربّعة، مكان تواجد القيمة يسمّى دليل index. إذًا إذا أردت أن أجد العنصر الموجود في المكان الأوّل من المصفوفة نكتب اسم المصفوفة، الأقواس المربّعة ورقم الدليل بداخلها هكذا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_25">
<span class="pln">list[1]</span></pre>

	<p>
		ولكن ماذا أعادت لنا روبي عند تنفيذ هذا؟ أعرف أنّك لم تتوقّع أن تعيد orangesبدلاً من apple. لماذا حدث ذلك لأنّ الترقيم في المصفوفات يبدأ من 0 وليس 1 فإذا أردنا الوصول إلى أوّل عنصر على الإطلاق في المصفوفة نكتب ذلك كالتالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_27">
<span class="pln">list[0]</span></pre>

	<h2>
		القيم السالبة
	</h2>
</div>

<div id="wmd-preview-section-19">
	<p>
		يستخدم نظام الترقيم الخاص بالمصفوفات قيمًا سالبة أيضًا وذلك إذا أردنا بدء العدّ من آخر المصفوفة. إذًا إذا أردت الوصول إلى آخر عنصر في المصفوفة يمكنك استخدام -1.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_29">
<span class="pln">list[-1]</span></pre>

	<p>
		هناك أيضًا دوال مدمجة جاهزة للوصول إلى أوّل وآخر عنصر في المصفوفة.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_31">
<span class="pln">list.first
list.last   </span></pre>

	<h2>
		دالة fetch
	</h2>
</div>

<div id="wmd-preview-section-20">
	<p>
		يمكن استخدام دالّة <span style="font-family:courier new,courier,monospace;">fetch</span> مع الدليل لإرجاع قيمة العنصر الموجود بهذا الدليل.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_33">
<span class="pln">list.fetch(2)   # "milk"</span></pre>

	<p>
		إذا تم كتابة معطى ثاني في الدّالّة ولا يوجد هناك العنصر الذي يشير إليه الدليل المحدّد فسيتمّ إرجاع القيمة الموجودة في المعطى الثّاني كقيمة افتراضيّة. مثال:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_35">
<span class="pln">list.fetch(20, "Not found") # "Not found"</span></pre>

	<h2>
		المصفوفة الجزئية
	</h2>
</div>

<div id="wmd-preview-section-21">
	<p>
		يمكننا أيضًا إرجاع مصفوفة جزئيّة Subset Array من مصفوفة عن طريق كتابة معطى Parameter إضافي مع الدليل. يشير هذا المعطى إلى طول المصفوفة الجزئيّة التي نريد إرجاعها. إذًا إذا أردنا إرجاع أوّل ثلاثة عناصر في المصفوفة نكتب ذلك كالتالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_38">
<span class="pln">list[0, 3]  # ["apples", "oranges", "milk"]</span></pre>

	<p>
		طريقة أخرى لإرجاع مصفوفة جزئيّة هو استخدام مجال معيّن <span style="font-family:courier new,courier,monospace;">range</span>.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_40">
<span class="pln">list[0..2]  # ["apples", "oranges", "milk"]</span></pre>

	<h3>
		دالة include
	</h3>
</div>

<div id="wmd-preview-section-22">
	<p>
		لمعرفة إذا كانت مصفوفة تحتوي على كائن معيّن نستخدم دالّة <span style="font-family:courier new,courier,monospace;">include</span> والتي تستقبل معطى باسم الكائن الذي نريد التحقّق من وجوده. وحيث أنّ الدّالّة منطقية (بمعنى أنّها ترجع true أو false فقط) فإنّنا نكتب في نهايتها علامة استفهام، <span style="font-family:courier new,courier,monospace;">?include</span>. إذًا لو أردنا معرفة إذا كانت تحتوي مصفوفة <span style="font-family:courier new,courier,monospace;">list</span> على سلسلة apples نكتب ذلك كالتالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6173_7">
<span class="pln">list.include?("apples")</span></pre>

	<h2>
		معرفة عدد عناصر المصفوفة
	</h2>
</div>

<div id="wmd-preview-section-23">
	<p>
		إذا أردت معرفة كم عدد العناصر بالمصفوفة فيمكن استخدام دالّة <span style="font-family:courier new,courier,monospace;">size</span> والتي تقوم بإرجاع عددًا صحيحًا يمثّل عدد العناصر الموجودة بالمصفوفة.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6173_9">
<span class="pln">list.size</span></pre>

	<p>
		اسم آخر لدالّة <span style="font-family:courier new,courier,monospace;">size</span> هو <span style="font-family:courier new,courier,monospace;">length</span>. جرّب كتابة الأمر التالي ولاحظ كيف تمّ إرجاع نفس النتائج.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6173_11">
<span class="pln">list.length</span></pre>

	<h2>
		إضافة عناصر إلى المصفوفة
	</h2>
</div>

<div id="wmd-preview-section-25">
	<h3 id="دالة-push">
		دالة push
	</h3>

	<p>
		ماذا لو أردنا إضافة شيء إلى المصفوفة؟ يمكننا إضافة سلسلة تحتوي على "cheese" إلى نهاية المصفوفة باستخدام دالّة <span style="font-family:courier new,courier,monospace;">push</span>. تقوم الدّالّة بإلحاق السلسلة التي نريد إضافتها بنهاية المصفوفة.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_60">
<span class="pln">list.push("cheese")</span></pre>

	<p>
		هناك عامل اختصار Shorthand Operator لفعل نفس الوظيفة وهي أقواس الزاوية المزدوجة Double Angle Brackets (&lt;&lt;). فمثلاً إذا أردنا إضافة سلسلة "juice" إلى مصفوفة <span style="font-family:courier new,courier,monospace;">list</span> بطريقة أسرع نكتب ذلك هكذا:
	</p>

	<pre class="ipsCode" id="ips_uid_1721_64">
list &lt;&lt; "juice"</pre>

	<p>
		أسهل وأسرع بكثير من دالّة <span style="font-family:courier new,courier,monospace;">push</span> أليس كذلك؟ والأمر اللّطيف أيضًا حول ذلك أن هذه الأسهم تشير إلى مصفوفة <span style="font-family:courier new,courier,monospace;">list</span> كما لو كانت تخبر روبي بإضافة السلسلة إلى تلك المصفوفة. 
	</p>

	<p>
		طريقة أخرى لإضافة عناصر إلى آخر المصفوفة هو استخدام معامل <strong>=+</strong> والذي يعني أن تجعل المصفوفة تساوي نفسها (=) بالإضافة إلى (+) القيمة الموجودة في الطرف الأيمن.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_66">
<span class="pln">list += ["bananas", "cereals"]</span></pre>

	<p>
		الشيفرة البرمجيّة أعلاه تطلب من روبي بأن تضيف السلسلتين "bananas" و"cereals" إلى نهاية المصفوفة <span style="font-family:courier new,courier,monospace;">list</span>.
	</p>
</div>

<div id="wmd-preview-section-26">
	<h3 id="دالة-unshift">
		دالة unshift
	</h3>

	<p>
		إذا أردنا إضافة عنصر إلى بداية المصفوفة وليس نهايتها فيمكننا استخدام دالّة <span style="font-family:courier new,courier,monospace;">unshift</span> والتي تعمل عمل <span style="font-family:courier new,courier,monospace;">push</span> مع فرق أنّها تضيف العنصر إلى بداية المصفوفة.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3902_7">
<span class="pln">list.unshift("carrots")</span></pre>

	<h2>
		حذف عناصر من المصفوفة
	</h2>
</div>

<div id="wmd-preview-section-28">
	<h3 id="دالة-pop">
		دالة pop
	</h3>

	<p>
		يمكننا استخراج آخر عنصر من المصفوفة باستخدام دالّة <span style="font-family:courier new,courier,monospace;">pop</span>. لنقل مثلاً أنّني قد غيّرت رأيي ولا أريد شراء العصير. يمكن إخراج العصير وهو العنصر الأخير في المصفوفة هكذا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_58">
<span class="pln">list.pop</span></pre>

	<p>
		كما تلاحظ لا نحتاج إلى معطيات لهذه الدّالّة فهي تقوم آليًّا بإخراج العنصر الأخير في المصفوفة. 
	</p>

	<p>
		بعد تنفيذ الأمر في سطر أوامر روبي التفاعليّ ستلاحظ أنّ روبي قامت بإرجاع قيمة العنصر المحذوف ولم ترجع المصفوفة نفسها. هذه الميزة مفيدة إذا أردنا استخدام العنصر الأخير/المحذوف. لكن لا تستخدم هذه الدّالّة للوصول إلى آخر عنصر إذا لم تكن تريد حذفه فعلاً حيث أنّك لو تحقّقت من المصفوفة من جديد ستجد أنّ العنصر الأخير قد اختفى.
	</p>
</div>

<div id="wmd-preview-section-29">
	<h3 id="دالة-shift">
		دالة shift
	</h3>

	<p>
		دالّة <span style="font-family:courier new,courier,monospace;">shift</span> مشابهة لدالّة <span style="font-family:courier new,courier,monospace;">unshift</span> والتي تضيف عنصر إلى بداية الدّالّة، الفرق الوحيد هو أنّ دالّة <span style="font-family:courier new,courier,monospace;">shift</span> تقوم بإرجاع وحذف العنصر الأوّل من المصفوفة. أو بعبارة أخرى، هي تقوم بنفس عمل دالّة <span style="font-family:courier new,courier,monospace;">pop</span> لكن على بداية المصفوفة.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_56">
<span class="pln">list.shift</span></pre>

	<h3>
		دالة drop
	</h3>
</div>

<div id="wmd-preview-section-30">
	<p>
		يمكننا استخدام دالّة <span style="font-family:courier new,courier,monospace;">drop</span> لحذف عدد من العناصر من مصفوفة معًا. المعطى الخاصّ بالدّالّة هو عدد العناصر المطلوب حذفها من بداية الدّالّة.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_53">
<span class="pln">list.drop(2)    # تقوم بحذف عنصرين من بداية الدّالّة</span></pre>

	<h3>
		دالة !slice
	</h3>
</div>

<div id="wmd-preview-section-31">
	<p>
		قد تتساءل ماذا لو أردت حذف عناصر ليست في بداية أو نهاية المصفوفة. يمكننا في هذه الحالة استخدام دالّة <span style="font-family:courier new,courier,monospace;">!slice</span>. تأخذ دالّة<span style="font-family:courier new,courier,monospace;"> !slice</span> المعطى الأول هو رقم الدليل المطلوب البدء منها والمعطى الثّاني هو عدد العناصر المطلوب حذفها.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_51">
<span class="pln">list.slice!(0, 3)</span></pre>

	<p>
		لاحظ أنّه في حال ما إذا لم نضف علامة التّعجّب في نهاية اسم الدّالة فإننا سنحصل على جزء من المصفوفة مثلما هو مُتوقّع، لكنّه لن يتم حذف العناصر من المصفوفة الأصلية
	</p>
</div>

<div id="wmd-preview-section-32">
	<h2 id="دالة-sort">
		دالة sort
	</h2>

	<p>
		يمكننا ترتيب مصفوفة باستخدام دالّة <span style="font-family:courier new,courier,monospace;">sort</span>. الأمر التالي سيؤدّي إلى ترتيب المصفوفة استنادًا إلى الحروف الأبجديّة:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_46">
<span class="pln">list.sort</span></pre>

	<p>
		ستلاحظ أنّه تمّ إرجاع المصفوفة وعناصرها مرتّبة أبجديًّا. ولكن لم يغيّر ذلك شيئًا في ترتيب المصفوفة الأصلي، يمكنك التحقّق من ذلك بنفسك. فقط اكتب اسم المصفوفة واضغط Enter. ستجد أنّ المصفوفة الأصليّة لم تتغيّر. 
	</p>

	<p>
		ولكن إذا أردت ترتيب المصفوفة وتغيير المصفوفة الأصليّة ماذا نفعل؟ يمكننا الآن الرجوع إلى دوال Bang التي تحدّثنا عنها في <a href="https://academy.hsoub.com/programming/ruby/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D9%88%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B1%D9%88%D8%A8%D9%8A-r254/">درس السلاسل</a> والتي تقوم بتعديل القيمة الأصليّة للكائن ونستدعيها عن طريقة كتابة اسم الدالّة الأصليّة متبوعة بعلامة تعجّب.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_49">
<span class="pln">list.sort!</span></pre>

	<h2>
		دالة reverse
	</h2>
</div>

<div id="wmd-preview-section-33">
	<p>
		يمكننا استخدام دالّة <span style="font-family:courier new,courier,monospace;">reverse</span> من أجل طباعة المصفوفة معكوسة. هذه المصفوفة أيضًا لا تغيّر من قيمة المصفوفة الأصليّة للأبد، ولكن إن أردنا تغيير المصفوفة الأصليّة فلدينا دالّة <span style="font-family:courier new,courier,monospace;">reverse!</span>.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_44">
<span class="pln">list.reverse</span></pre>

	<h2>
		دالة join
	</h2>
</div>

<div id="wmd-preview-section-34">
	<p>
		دالّة أخيرة سنتعرّف عليها هي دالّة <span style="font-family:courier new,courier,monospace;">join</span>. هذه الدّالّة مفيدة جدًّا لأنّه يمكن استخدامها لإنشاء سلسلة تقوم بدمج جميع عناصر مصفوفة معًا. تستقبل الدّالّة معطى يحتوي على الرّمز الذي تريد استخدامه كفاصل. مثلاً الأمر التالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1721_42">
<span class="pln">list.join(",")</span></pre>

	<p>
		ماذا فعلنا هنا؟ لقد استدعينا دالّة <span style="font-family:courier new,courier,monospace;">join</span> على مصفوفة <span style="font-family:courier new,courier,monospace;">list</span> ومعطى الدّالّة هو سلسلة تحتوي على فاصلة والتي ستستخدم كفاصل بين عناصر المصفوفة. عند تنفيذ هذا الأمر ستطبع لك روبي على الشّاشة سلسلة تحتوي على جميع العناصر وبين كل عنصر والآخر الفاصلة التي أردنا استخدامها.
	</p>
</div>

<div id="wmd-preview-section-35">
	<h2 id="خاتمة">
		خاتمة
	</h2>

	<p>
		تعرّفنا في هذا الدّرس على أحد المفاهيم المهمّة في روبي وأيّ لغة برمجة عمومًا وهي المصفوفات. مع تعمّقك أكثر في تعلّم روبي ستلاحظ فوائد استخدام المصفوفات في شيفراتك البرمجيّة. تعرّفنا على الدوال الرئيسيّة المستخدمة مع المصفوفات ولكن إذا أردت معرفة معلومات أكثر عن ذلك يمكنك قراءة <a href="http://ruby-doc.org/core-2.2.0/Array.html" rel="external nofollow">التوثيق الخاص بالمصفوفات في روبي</a>.
	</p>
</div>
]]></description><guid isPermaLink="false">280</guid><pubDate>Fri, 12 Feb 2016 22:03:00 +0000</pubDate></item></channel></rss>
