كيفية العمل مع المصفوفات في روبي

المقدمة

المصفوفة هي هيكل بيانات يمثل قائمة من القيم، تُسمى العناصر. تُمكّن المصفوفات من تخزين قيم متعددة في متغير واحد. في روبي، يمكن أن تحتوي المصفوفات على أي نوع من البيانات، بما في ذلك الأرقام والسلاسل النصية وغيرها من كائنات روبي. يمكن أن يُكوّن هذا الأمر وينظم الكود الخاص بك، مما يجعله أكثر قراءة وصيانة. جميع المصفوفات هي كائنات بأساليبها الخاصة التي يمكنك استدعائها، مما يوفر وسيلة موحدة للعمل مع مجموعات البيانات.

في هذا البرنامج التعليمي، ستقوم بإنشاء مصفوفات، والوصول إلى القيم التي تحتويها، وإضافة وتعديل وإزالة العناصر في مصفوفة، والتكرار من خلال العناصر في مصفوفة لحل المشاكل أكثر تعقيداً.

إنشاء مصفوفة

سوف تبدأ بالنظر في كيفية إنشاء المصفوفات بالتفصيل أكثر. كمثال، إليك قائمة بأنواع مختلفة من أسماك القرش. بدون مصفوفة، قد تخزنها في متغيرات فردية:

sharks.rb
shark1 = "Hammerhead"
shark2 = "Great White"
shark3 = "Tiger"

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

إذا استخدمت مصفوفة، يمكنك تبسيط هذه البيانات. لإنشاء مصفوفة في برنامج روبي، استخدم الأقواس المربعة: ([])، وافصل القيم التي تريد تخزينها بفواصل:

sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger"]

بدلاً من إنشاء ثلاث متغيرات منفصلة، لديك الآن متغير واحد يحتوي على جميع القروش الثلاثة. في هذا المثال، استخدمت الأقواس المربعة — [] — لإنشاء مصفوفة، وفصلت كل إدخال بفاصلة. إذا كنت بحاجة إلى إضافة قرش إضافي، فسوف تضيف قرشًا آخر إلى المصفوفة بدلاً من إنشاء وإدارة متغير جديد.

يمكنك طباعة مصفوفة كاملة بجملة print، والتي ستعرض محتويات المصفوفة:

print sharks
Output
["Hammerhead", "Great White", "Tiger"]

إذا كنت ترغب في إنشاء مصفوفة حيث كل إدخال هو كلمة واحدة، يمكنك استخدام بناء الجملة %w{}، والذي ينشئ مصفوفة كلمات:

days = %w{Monday Tuesday Wednesday Thursday Friday Saturday Sunday}

هذا يعادل إنشاء المصفوفة بالأقواس المربعة:

days =  ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

ومع ذلك، لاحظ أن طريقة %w{} تتيح لك تخطي الاقتباسات والفواصل.

غالبًا ما تُستخدم المصفوفات لتجميع قوائم من أنواع البيانات المتشابهة، ولكن في Ruby، يمكن أن تحتوي المصفوفات على أي قيمة أو مزيج من القيم. يشمل ذلك مصفوفات أخرى. إليك مثال على مصفوفة تحتوي على سلسلة، قيمة nil، عدد صحيح، ومصفوفة من السلاسل:

mixed_data.rb
record = [
    "Sammy",
    null,
    7,
    [
        "another",
        "array",
    ]
]

الآن ستنظر في كيفية الوصول إلى البيانات المخزنة في المصفوفات.

الوصول إلى العناصر في المصفوفات

للوصول إلى عنصر معين، أو عنصر في مصفوفة، يتم الإشارة إلى فهرسه، أو موضعه في المصفوفة. في Ruby، تبدأ الفهارس من الصفر. لاسترداد العنصر الأول من مصفوفتك sharks، يتم إلحاق فهرس العنصر بالمتغير باستخدام الأقواس المربعة:

sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger"]

تحتوي مصفوفة sharks على ثلاثة عناصر. فيما يلي تفصيل لكيفية ترقيم كل عنصر في مصفوفة sharks.

Hammerhead Great White Tiger
0 1 2

العنصر الأول في المصفوفة هو Hammerhead، والذي يتم ترقيمه بـ 0. العنصر الأخير هو Tiger، والذي يتم ترقيمه بـ 2. العد التنازلي يبدأ من 0 في الترقيم، وهو ما يتنافى مع التصور الطبيعي الذي يبدأ العد من 1، لذا عليك أن تأخذ هذا في اعتبارك حتى يصبح ذلك طبيعياً.

ملاحظة: قد يساعدك في التفكير في الفهرس كمزاح للمكان، أي عدد الأماكن من بداية المصفوفة. العنصر الأول في البداية، لذا فهرسه، أو فهرسه، هو 0. العنصر الثاني على بعد مكان واحد من الدخول الأول في المصفوفة، لذا فهرسه، أو فهرسه، هو 1.

يمكنك معرفة عدد العناصر في مصفوفة باستخدام طريقة length:

sharks.length
Output
3

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

إذا كنت ترغب في معرفة رقم الفهرس لعنصر معين في مصفوفة، مثل Tiger، استخدم طريقة index():

print sharks.index("Tiger")
Output
2

هذا يعيد الفهرس لأول عنصر يحتوي على هذا النص. إذا لم يتم العثور على رقم فهرس، مثل القيمة التي لا توجد، ستعيد الوحدة التحكم nil:

print sharks.index("Whale")
Output
nil

للحصول على العنصر الأخير في مصفوفة Ruby، استخدم الفهرس -1:

print sharks[-1]
Output
"Tiger"

توفر Ruby أيضًا طرق first و last للحصول على العناصر الأولى والأخيرة دون استخدام فهارس:

puts sharks.first
puts sharks.last
Output
"Hammerhead" "Tiger"

محاولة الوصول إلى فهرس غير موجود ستعيد nil:

sharks[10]
Output
nil

يمكن أن تحتوي المصفوفات على مصفوفات أخرى، والتي تسمى nested arrays. هذه طريقة لنمذجة مجموعات البيانات ثنائية الأبعاد في برنامج. إليك مثالًا على مصفوفة متداخلة:

nested_array = [
    [
        "salmon",
        "halibut",
    ],
    [
        "coral",
        "reef",
    ]
]

للوصول إلى العناصر في مصفوفة متداخلة، يجب عليك إضافة فهرس إضافي ليتناسب مع المصفوفة الداخلية. على سبيل المثال، لاسترداد القيمة coral من هذه المصفوفة المتداخلة، يمكنك استخدام البيان التالي:

print nested_array[1][0];
Output
coral

في هذا المثال، قمت بالوصول إلى المصفوفة في الموضع 1 من المتغير nested_array، والتي أعادت المصفوفة ["coral", "reef"]. ثم قمت بالوصول إلى العناصر في الموضع 0 من تلك المصفوفة، والتي كانت "coral".

الآن ستتعرف على كيفية إضافة عناصر إلى مصفوفة.

إضافة عناصر إلى المصفوفات

لديك ثلاثة عناصر في مصفوفتك sharks، والتي يتم فهرستها من 0 إلى 2:

sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger"]

هناك عدة طرق لإضافة عنصر جديد. يمكنك تعيين قيمة للفهرس التالي، والذي في هذه الحالة سيكون 3:

sharks[3] = "Whale";

print sharks
Output
["Hammerhead", "Great White", "Tiger", "Whale"]

هذه الطريقة عرضة للخطأ على الرغم من ذلك. إذا قمت بإضافة عنصر وتخطيت بالخطأ فهرسًا، فستنشئ عنصرًا nil في الصفيف.

sharks[5] = "Sand";

print sharks;
Output
["Hammerhead", "Great White", "Tiger", "Whale", nil, "Sand"]

ستعيد محاولة الوصول إلى العنصر الزائد في الصفيف قيمته، والتي ستكون nil:

sharks[4]
Output
nil

إيجاد الفهرس المتاح التالي في صفيف هو عرضة للخطأ ويستغرق وقتًا إضافيًا. تجنب الأخطاء باستخدام طريقة push، التي تضيف عنصرًا إلى نهاية الصفيف:

sharks.push("Thresher")
print sharks
Output
["Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher"]

يمكنك أيضًا استخدام بنية << بدلاً من طريقة push لإضافة عنصر إلى نهاية الصفيف:

sharks << "Bullhead"
Output
["Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", "Bullhead"]

لإضافة عنصر إلى بداية الصفيف، استخدم طريقة unshift():

sharks.unshift("Angel")
print sharks
Output
["Angel", "Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", "Bullhead"]

الآن بعد أن تعرفت كيفية إضافة العناصر، ستنظر إلى كيفية إزالتها.

إزالة العناصر من الصفائف

لإزالة عنصر معين من صفيف، استخدم الطرق delete أو delete_at. في صفيف القروش، قمت بإنشاء عنصر صفيف nil في وقت سابق. الآن، ستتخلص منه.

أولاً، ابحث عن موقعه في الصفيف. يمكنك استخدام الطريقة index لذلك:

print sharks.index(nil)
Output
4

ثم استخدم delete_at لإزالة العنصر في الفهرس 4 واطبع الصفيف:

sharks.delete_at(4)
print sharks
Output
["Angel", "Hammerhead", "Great White", "Tiger", "Whale", "Thresher", "Bullhead"]

الطريقة `delete` تزيل العناصر من مصفوفة تتطابق مع القيمة التي تمررها. استخدمها لإزالة `Whale` من المصفوفة:

sharks.delete("Whale")
print sharks;
Output
["Angel", "Hammerhead", "Great White", "Tiger", "Thresher", "Bullhead"]

الطريقة `delete` ستزيل كل حالات القيمة التي تمررها، لذا إذا كانت المصفوفة لديك تحتوي على عناصر مكررة، فسيتم إزالتها جميعًا.

الطريقة `pop` ستزيل العنصر الأخير في المصفوفة:

sharks.pop
print sharks;
Output
["Angel", "Hammerhead", "Great White", "Tiger", "Thresher"]

تمت إزالة `Bullhead` كعنصر آخر من المصفوفة. لإزالة العنصر الأول في المصفوفة، استخدم الطريقة `shift`:

sharks.shift
print sharks
Output
["Hammerhead", "Great White", "Tiger", "Thresher"]

هذه المرة، تم إزالة `Angel` من بداية المصفوفة.

من خلال استخدام الطرق `pop` و `shift`، يمكنك إزالة العناصر من بداية ونهاية المصفوفات. يُفضل استخدام الطريقة `pop` في كل مرة يكون ذلك ممكنًا، حيث يحتفظ بقية العناصر في المصفوفة بأرقام فهرسها الأصلية.

الطرق `delete_at`، `pop`، و `shift` تقوم جميعًا بتغيير المصفوفة الأصلية وتعيد العنصر الذي حذفته::

sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
deleted_at_element = sharks.delete_at(1)
popped_element = sharks.pop

puts "Deleted_at element: #{deleted_at_element}"
puts "Popped element: #{popped_element}"

puts "Remaining array: #{sharks}"
Output
Deleted_at element: Great White Popped element: Whale Remaining array: ["Hammerhead", "Tiger"]

أنت الآن تعرف عدة طرق لإزالة العناصر من المصفوفة. الآن ستنظر إلى كيفية تعديل العنصر الذي لديك بالفعل.

تعديل العناصر الحالية في المصفوفات

لتحديث عنصر في المصفوفة، قم بتعيين قيمة جديدة لفهرس العنصر باستخدام مشغل النسبة، تمامًا كما تفعل مع متغير عادي.

مع إعطاء مصفوفة جديدة من القروش، مع “Hammerhead” في الفهرس 0، ستستبدل “Hammerhead” بـ “Angel”:

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks[0] = "Angel"
print sharks;
Output
["Angel", "Great White", "Tiger", "Whale"]

للتأكد من تحديث العنصر الصحيح، يمكنك استخدام طريقة `index` لتحديد الموقع أولاً، تمامًا كما فعلت للعثور على العنصر الذي أردت حذفه.

الآن ستقوم بالنظر في كيفية العمل مع كل العناصر في المصفوفة.

التكرار عبر المصفوفات

توفر Ruby العديد من الطرق للتكرار عبر مصفوفة، وكل طريقة تعتمد على نوع العمل الذي تريد أداؤه. فيما بعد، ستكتشف كيفية التكرار عبر مصفوفة وعرض كل عنصر من عناصرها.

توفر Ruby بنية `for..in`:

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
for shark in sharks do
  puts shark
end

بالنسبة لكل عنصر في مصفوفة القروش، يعين Ruby هذا العنصر للمتغير المحلي `shark`. يمكنك بعد ذلك طباعة قيمة العنصر باستخدام `puts`.

لن ترى `for..in` كثيرًا على الرغم من ذلك. المصفوفات في Ruby هي كائنات، وتوفر الطريقة `each` للعمل مع العناصر. تعمل الطريقة `each` بطريقة مشابهة لـ `for..in`، ولكن لها بنية تركيبية مختلفة:

each.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each do |shark|
  puts shark
end

الطريقة each تستخدم بنية يرى المرء استخدامها كثيرًا في برمجة Ruby. إنها تأخذ كتلة Ruby كمعامل لها. الكتلة هي بعض الشفرة التي ستُنفذ لاحقًا في سياق الطريقة. في هذه الحالة، الشفرة هي puts shark. الكلمة المفتاحية shark، المحصورة بين علامات القضيب (|)، هي المتغير المحلي الذي يُمثّل العنصر في المصفوفة الذي ستصل إليه الكتلة. تُسند Ruby العنصر إلى هذا المتغير وتنفذ الشفرة في الكتلة. تكرر الطريقة each هذه العملية لكل عنصر في المصفوفة:

Output
Hammerhead Great White Tiger Whale

عندما تكون الكتلة سطرًا واحدًا فقط، غالبًا ما ترى مطوري Ruby يستبدلون الكلمات الرئيسية do و end بالأقواس المجعدة ويختصرون البيان بأكمله في سطر واحد:

each.rb
...
sharks.each {|shark| puts shark }

هذا ينتج نفس النتائج ولكن باستخدام أسطر أقل.

الطريقة each_with_index تعمل بطريقة مماثلة، ولكنها تمنحك أيضًا الوصول إلى فهرس عنصر المصفوفة. يستخدم هذا البرنامج each_with_index لطباعة الفهرس والقيمة لكل عنصر:

each_with_index.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each_with_index do |shark, index|
  puts "The index is #{index}"
  puts "The value is #{shark}"
end

بالنسبة لكل عنصر في المصفوفة، يُسند Ruby العنصر إلى المتغير shark، ويُسند الفهرس الحالي إلى المتغير index. يمكنك بعد ذلك الإشارة إلى كل من تلك المتغيرات في الكتلة.

Output
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

ستكرر التكرار على العناصر في مصفوفة كثيرًا في برامجك الخاصة، مثل عندما تحتاج إلى عرض العناصر من قاعدة بيانات على موقع ويب، أو عندما تقوم بقراءة الأسطر من ملف ومعالجة محتوياتها.

الختام

المصفوفات هي جزء متعدد الاستخدامات وأساسي من البرمجة في روبي. في هذا البرنامج التعليمي، قمت بإنشاء مصفوفات والوصول إلى عناصر فردية. كما قمت بإضافة وإزالة وتعديل العناصر في المصفوفة. وفي النهاية، استكشفت طريقتين لتكرار المصفوفة وعرض محتوياتها، والتي تُستخدم كطريقة شائعة لعرض البيانات.

تعرف على أنواع بيانات أخرى في روبي من خلال قراءة البرنامج التعليمي فهم أنواع البيانات في روبي.

Source:
https://www.digitalocean.com/community/tutorials/how-to-work-with-arrays-in-ruby