الفرق بين المراجعتين لصفحة: «Ruby/Array»
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) لا ملخص تعديل |
||
(14 مراجعة متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE: الصنف Array في روبي}}</noinclude> | <noinclude>{{DISPLAYTITLE: الصنف <code>Array</code> في روبي}}</noinclude> | ||
[[تصنيف: Ruby]] | [[تصنيف: Ruby]] | ||
[[تصنيف: Ruby | [[تصنيف: Ruby Class]] | ||
[[تصنيف: Ruby Array]] | [[تصنيف: Ruby Array]] | ||
المصفوفات هي مجموعات مُرتَّبة ومُفهرسة | المصفوفات هي مجموعات مُرتَّبة ومُفهرسة بالأعداد الصحيحة (integer-indexed) ومُكونة من أي نوع من الكائنات. | ||
تبدأ فهارس المصفوفات بالعدد <code>0</code>، كما هو الحال في لغتي C و Java. ويفترض أن يُحسب الفهرس السالب بدءًا من نهاية المصفوفة، أي أنَّ الفهرس ذا القيمة <code>-1</code> يشير إلى العنصر الأخير في المصفوفة، والفهرس <code>-2</code> يمثل موضع العنصر ما قبل الأخير، وهلم جرًا. | |||
== إنشاء المصفوفات == | |||
يمكن | يمكن إنشاء مصفوفة جديدة باستخدام المعامل <code>[]</code> الباني. | ||
يمكن أن تحتوي المصفوفة نفسها على أنواع مختلفة من الكائنات. على سبيل المثال، المصفوفة التالية تحتوي على عدد صحيح (Integer) وسلسلة نصية (String) وعدد عشري:<syntaxhighlight lang="ruby"> | |||
ary = [1, "two", 3.0] #=> [1, "two", 3.0] | |||
</syntaxhighlight>كما يمكن إنشاء مصفوفة من خلال استدعاء التابع [[Ruby/Array/new|<code>::new</code>]]<nowiki/>مباشرةً دون تمرير أية وسائط إليه، أو مع تمرير وسيط واحد (الذي يمثل الحجم الأولي للمصفوفة) أو وسيطين (الحجم الأولي والكائنات الافتراضية [default object]).<syntaxhighlight lang="ruby"> | |||
ary = Array.new #=> [] | |||
Array.new(3) #=> [nil, nil, nil] | |||
Array.new(3, true) #=> [true, true, true] | |||
</syntaxhighlight>لاحظ أنَّ الوسيط الثاني يملأ كامل المصفوفة بقيمة الكائن المعطى نفسه. بناءً على ذلك، يُنصح باستخدامه فقط في الحالات التي تحتاج فيها إلى إنشاء مصفوفات باستخدام كائنات غير قابلة للتغيير (immutable) مثل الرموز (Symbols) والأرقام والقيم المنطقية. | |||
لإنشاء مصفوفة تحتوي كائنات مختلفة، فيمكن تمرير كتلة برمجية إلى التابع [[Ruby/Array/new | <code>new</code>]]. هذه الطريقة آمنة للاستخدام مع الكائنات القابلة للتغيير (mutable) مثل الخرائط (hashes) أو السلاسل النصية (strings) أو مصفوفات أخرى:<syntaxhighlight lang="ruby"> | |||
Array.new(4) { Hash.new } #=> [{}, {}, {}, {}] | |||
Array.new(4) {|i| i.to_s } #=> ["0", "1", "2", "3"] | |||
</syntaxhighlight>هذه الطريقة مفيدة وسريعة لبناء مصفوفات متعددة الأبعاد (multi-dimensional arrays):<syntaxhighlight lang="ruby"> | |||
Array.new(4) { Hash.new } #=> [{}, {}, {}, {}] | |||
Array.new(4) {|i| i.to_s } #=> ["0", "1", "2", "3"] | |||
</syntaxhighlight>يمكن أيضًا إنشاء مصفوفة باستخدام التابع [[Ruby/Array/Array|<code>Array()</code>]]، والذي يستدعي التابع [[Ruby/Array/to_ary | <code>to_ary</code>]] ثم التابع [[Ruby/Array/to_a | <code>to_a</code>]] مع الوسائط المُمرَّرة.<syntaxhighlight lang="ruby"> | |||
Array({:a => "a", :b => "b"}) #=> [[:a, "a"], [:b, "b"]] | |||
</syntaxhighlight> | |||
== التوابع المستعملة مع المصفوفات == | |||
بالإضافة إلى توابع الصنف <code>[[Ruby/Enumerable|Enumerable]]</code>، فإنّ للصنف <code>Array</code> توابع خاصة به تستعمل في الوصول إلى المصفوفة والبحث فيها وغيرها من الأمور. | |||
== الوصول إلى العناصر == | |||
يمكن جلب عناصر من أي مصفوفة باستخدام معامل الفهرسة [[Ruby/Array/index operator|<code>[]</code>]]، إذ يمرَّر إلى هذا المعامل عددًا صحيحًا واحدًا (يمثل فهرس العنصر [index])، أو زوجًا من الأعداد (أحدهما يمثل بداية العنصر والأخر يمثل طول العناصر المراد جلبها)، أو مجالًا (يمثل بداية ونهاية العناصر المراد جلبها). إن أعطيت قيمة سالبة للفهرس، فسيُسحَب موضع العنصر بدءًا من نهاية المصفوفة؛ يمثل الفهرس <code>-1</code> مثلًا موضع العنصر الأخير.<syntaxhighlight lang="ruby"> | |||
arr = [1, 2, 3, 4, 5, 6] | |||
arr[2] #=> 3 | |||
arr[100] #=> nil | |||
arr[-3] #=> 4 | |||
arr[2, 3] #=> [3, 4, 5] | |||
arr[1..4] #=> [2, 3, 4, 5] | |||
arr[1..-3] #=> [2, 3, 4] | |||
</syntaxhighlight>هنالك طريقة أخرى للوصول إلى أحد عناصر مصفوفة وهي باستخدام التابع [[Ruby/Array/at |<code>at</code>]]:<syntaxhighlight lang="ruby"> | |||
arr.at(0) #=> 1 | |||
</syntaxhighlight>أمَّا التابع<nowiki/>[[Ruby/Array/slice | <code>slice</code>]]، فيعمل بطريقة مشابهة لمعامل الفهرسة [[Ruby/Array/index operator|<code>[]</code>]]. | |||
إن أردت أن يُطلَق خطأٌ أو تُظهر رسالة أو قيمة معينة إذا أشار فهرسٌ إلى عنصر خارج المصفوفة، فيمكنك استخدام التابع [[Ruby/Array/fetch | <code>fetch</code>]].<syntaxhighlight lang="ruby"> | |||
arr = ['a', 'b', 'c', 'd', 'e', 'f'] | |||
arr.fetch(100) #=> IndexError: index 100 outside of array bounds: -6...6 | |||
arr.fetch(100, "oops") #=> "oops" | |||
</syntaxhighlight> | |||
يجلب التابعان<nowiki/>[[Ruby/Array/first | <code>first</code>]] و <code>[[Ruby/Array/last|last]]</code> العنصرين الأول والأخير من مصفوفة على التوالي.<syntaxhighlight lang="ruby"> | |||
arr.first #=> 1 | |||
arr.last #=> 6 | |||
</syntaxhighlight> | |||
للحصول على أول <code>n</code> عنصر من مصفوفة، يمكن استخدام التابع<nowiki/>[[Ruby/Array/take | <code>take</code>:]] <syntaxhighlight lang="ruby"> | |||
arr.take(3) #=> [1, 2, 3] | |||
</syntaxhighlight> | |||
يفعل التابع<nowiki/>[[Ruby/Array/drop | <code>drop</code>]] بشكل معاكس لما يفعله التابع [[Ruby/Array/take | <code>take</code>]]، إذ يعيد آخر <code>n</code> عنصر من المصفوفة:<syntaxhighlight lang="ruby"> | |||
arr.drop(3) #=> [4, 5, 6] | |||
</syntaxhighlight> | |||
== الحصول على معلومات متعلقة بمصفوفة == | |||
تخزِّن المصفوفات طولها (عدد عناصرها [تدعى «حجم المصفوفة» في بعض الأحيان]) باستمرار. لمعرفة عدد عناصر أي مصفوفة، يمكن استخدام أحد التوابع [[Ruby/Array/length | <code>length</code>]] أو [[Ruby/Array/count | <code>count</code>]] أو [[Ruby/Array/size | <code>size</code>]]:<syntaxhighlight lang="ruby"> | |||
browsers = ['Chrome', 'Firefox', 'Safari', 'Opera', 'IE'] | |||
browsers.length #=> 5 | |||
browsers.count #=> 5 | |||
</syntaxhighlight> | |||
للتحقق مما إذا كانت مصفوفة فارغة أم لا، يمكن استخدام التابع [[Ruby/Array/empty|<code>empty?</code>]]:<syntaxhighlight lang="ruby"> | |||
browsers.empty? #=> false | |||
</syntaxhighlight> | |||
لمعرفة إذا كان عنصر معين موجودًا في مصفوفة، يمكن استخدام التابع <code>[[Ruby/Array/include|include?]]</code>:<syntaxhighlight lang="ruby"> | |||
يمكن | browsers.include?('Konqueror') #=> false | ||
</syntaxhighlight> | |||
== إضافة عناصر إلى المصفوفات == | |||
يمكن إضافة عناصر معينة إلى نهاية مصفوفة باستخدام إمَّا التابع<nowiki/>[[Ruby/Array/push | <code>push</code>]] أو المعامل [[Ruby/Array/append operator|<code><<</code>]]:<syntaxhighlight lang="ruby"> | |||
arr = [1, 2, 3, 4] | |||
arr.push(5) #=> [1, 2, 3, 4, 5] | |||
arr << 6 #=> [1, 2, 3, 4, 5, 6] | |||
</syntaxhighlight> | |||
أمَّا التابع [[Ruby/Array/ | أمَّا التابع<nowiki/>[[Ruby/Array/unshift | <code>unshift</code>]]، فيضيف عنصرًا جديدًا إلى بداية المصفوفة.<syntaxhighlight lang="ruby"> | ||
arr.unshift(0) #=> [0, 1, 2, 3, 4, 5, 6] | |||
</syntaxhighlight> | |||
يستعمل التابع<nowiki/>[[Ruby/Array/insert | <code>insert</code>]] لإدراج عنصر جديد في المصفوفة في أي موضع فيها.<syntaxhighlight lang="ruby"> | |||
arr.insert(3, 'apple') #=> [0, 1, 2, 'apple', 3, 4, 5, 6] | |||
</syntaxhighlight> | |||
ويستعمل التابع<nowiki/>[[Ruby/Array/insert | <code>insert</code>]] أيضًا لإدراج عدة قيم في الوقت نفسه:<syntaxhighlight lang="ruby"> | |||
arr.insert(3, 'orange', 'pear', 'grapefruit') | |||
#=> [0, 1, 2, "orange", "pear", "grapefruit", "apple", 3, 4, 5, 6] | |||
</syntaxhighlight> | |||
== إزالة عناصر من مصفوفة == | |||
يزيل التابع<nowiki/>[[Ruby/Array/pop | <code>pop</code>]] العنصر الأخير من مصفوفة ثم يعيده:<syntaxhighlight lang="ruby"> | |||
arr = [1, 2, 3, 4, 5, 6] | |||
arr.pop #=> 6 | |||
arr #=> [1, 2, 3, 4, 5] | |||
</syntaxhighlight> | |||
لجلب العنصر الأول من مصفوفة وحذفه أيضًا منها في الوقت نفسه، استخدم التابع [[Ruby/Array/shift | <code>shift</code>]]:<syntaxhighlight lang="ruby"> | |||
arr.shift #=> 1 | |||
arr #=> [2, 3, 4, 5] | |||
</syntaxhighlight> | |||
لحذف عنصر ذي فهرس محدد، يمكن استعمال التابع <code> | لحذف عنصر ذي فهرس محدد، يمكن استعمال التابع<nowiki/>[[Ruby/Array/delete_at | <code>delete_at</code>]]:<syntaxhighlight lang="ruby"> | ||
arr.delete_at(2) #=> 4 | |||
arr #=> [2, 3, 5] | |||
</syntaxhighlight> | |||
لحذف عنصر معين موجود في أي مكان في مصفوفة، يمكن استخدام التابع<nowiki/>[[Ruby/Array/delete | <code>delete</code>]]:<syntaxhighlight lang="ruby"> | |||
arr = [1, 2, 2, 3] | |||
arr.delete(2) #=> 2 | |||
arr #=> [1,3] | |||
</syntaxhighlight> | |||
إن أردت إزالة كل القيم <code>nil</code> من مصفوفة، فاستخدم التابع<nowiki/>[[Ruby/Array/compact | <code>compact</code>]] :<syntaxhighlight lang="ruby"> | |||
arr = ['foo', 0, nil, 'bar', 7, 'baz', nil] | |||
arr.compact #=> ['foo', 0, 'bar', 7, 'baz'] | |||
arr #=> ['foo', 0, nil, 'bar', 7, 'baz', nil] | |||
arr.compact! #=> ['foo', 0, 'bar', 7, 'baz'] | |||
arr #=> ['foo', 0, 'bar', 7, 'baz'] | |||
</syntaxhighlight> | |||
لإزالة العناصر المتكررة من مصفوفة، يمكن استخدام إمَّا التابع [[Ruby/Array/uniq |<code>uniq</code>]]<nowiki/>الذي لا يغير المصفوفة (non-destructive) أو التابع <code>[[Ruby/Array/uniq!|uniq!]]</code> الذي يغير المصفوفة (destructive). <syntaxhighlight lang="ruby"> | |||
arr = [2, 5, 6, 556, 6, 6, 8, 9, 0, 123, 556] | |||
arr.uniq #=> [2, 5, 6, 556, 8, 9, 0, 123] | |||
</syntaxhighlight> | |||
== تنفيذ عمليات تكرارية على المصفوفات == | |||
بشكل مشابه لكل الأصناف التي تشملها الوحدة <code>Enumerable</code>، يملك الصنف <code>Array</code> التابع [[Ruby/Array/each | <code>each</code>]] الذي يحدد العناصر التي يراد التكرار عليها وما الذي سيطبق في كل عملية. في حالة التابع [[Ruby/Array/each | <code>each</code>]] الخاص بالصنف <code>Array</code>، كل عناصر المصفوفة تكون مشمولةً في تكرار تنفيذ كتل برمجية معطاة عليها. | |||
لاحظ أنَّ هذه العملية لا تغير المصفوفة:<syntaxhighlight lang="ruby"> | |||
arr = [1, 2, 3, 4, 5] | |||
arr.each { |a| print a -= 10, " " } | |||
# prints: -9 -8 -7 -6 -5 | |||
#=> [1, 2, 3, 4, 5] | |||
</syntaxhighlight> | |||
من التوابع المفيدة أيضًا التابع<nowiki/>[[Ruby/Array/reverse_each | <code>reverse_each</code>]]، الذي يشبه التابع<nowiki/>[[Ruby/Array/each | <code>each</code>]] تمامًا باستثناء أنه يكرّر (iterate) تنفيذ الكتلة البرمجية على عناصر المصفوفة بشكل معاكس أي يبدأ من العنصر الأخير وحتى العنصر الأول.<syntaxhighlight lang="ruby"> | |||
words = %w[first second third fourth fifth sixth] | |||
str = "" | |||
words.reverse_each { |word| str += "#{word} " } | |||
p str #=> "sixth fifth fourth third second first " | |||
</syntaxhighlight> | |||
يمكن استخدام التابع<nowiki/>[[Ruby/Array/map | <code>map</code>]] لإنشاء مصفوفة جديدة انطلاقًا من مصفوفة موجودة مسبقًا، إذ سيمرر كل عنصر من عناصر هذه المصفوفة إلى كتلة برمجية تعيد بدورها قيمة ما:<syntaxhighlight lang="ruby"> | |||
arr.map { |a| 2*a } #=> [2, 4, 6, 8, 10] | |||
arr #=> [1, 2, 3, 4, 5] | |||
arr.map! { |a| a**2 } #=> [1, 4, 9, 16, 25] | |||
arr #=> [1, 4, 9, 16, 25] | |||
</syntaxhighlight> | |||
== اختيار عناصر محددة من مصفوفة == | |||
يمكن اختيار عناصر من مصفوفة وفقًا لمعايير محددة في كتلة برمجية (block). يمكن أن تجرى عملية الاختيار بطريقة هادمة (destructive) للمصفوفة الأصلية أو بطريقة غير هادمة (non-destructive)، إذ ستعدل العمليات الهادمة على المصفوفة الأصلية بينما تنشئ العمليات غير الهادمة مصفوفة جديدة تضع فيها العناصر الناتجة. | |||
=== الاختيار غير الهادم (Non-destructive Selection) === | |||
مثالٌ على الاختيار غير الهادم الذي يجرى باستعمال التابع<nowiki/>[[Ruby/Array/select | <code>select</code>]]، والتابع<nowiki/>[[Ruby/Array/reject | <code>reject</code>]]، والتابع<nowiki/>[[Ruby/Array/drop_while | <code>drop_while</code>]]:<syntaxhighlight lang="ruby"> | |||
arr = [1, 2, 3, 4, 5, 6] | |||
arr.select { |a| a > 3 } #=> [4, 5, 6] | |||
arr.reject { |a| a < 3 } #=> [3, 4, 5, 6] | |||
arr.drop_while { |a| a < 4 } #=> [4, 5, 6] | |||
arr #=> [1, 2, 3, 4, 5, 6] | |||
</syntaxhighlight> | |||
=== الاختيار الهادم (Destructive Selection) === | |||
يقابل التابعان [[Ruby/Array/select! |<code>select!</code>]] و<nowiki/>[[Ruby/Array/reject! | <code>reject!</code>]] الهادمان التابعين<nowiki/>[[Ruby/Array/select | <code>select</code>]] و<nowiki/>[[Ruby/Array/reject | <code>reject</code>]] غير الهادمين. | |||
بشكل مماثل للتابع<nowiki/>[[Ruby/Array/select | <code>select</code>]] والتابع<nowiki/>[[Ruby/Array/reject | <code>reject</code>]] المعاكس له، يعطي التابعان<nowiki/>[[Ruby/Array/delete_if | <code>delete_if</code>]] و<nowiki/>[[Ruby/Array/keep_if | <code>keep_if</code>]] نتيجة معاكسة إن استعملت معهما الكتلة البرمجية نفسها:<syntaxhighlight lang="ruby"> | |||
arr.delete_if { |a| a < 4 } #=> [4, 5, 6] | |||
arr #=> [4, 5, 6] | |||
arr = [1, 2, 3, 4, 5, 6] | |||
arr.keep_if { |a| a < 4 } #=> [1, 2, 3] | |||
arr #=> [1, 2, 3] | |||
</syntaxhighlight> | |||
== توابع الصنف العامة (Public Class Methods) == | |||
===<code>[[Ruby/Array/assign_operator|[]]]</code>=== | |||
يعيّن قيمة عنصر ذي فهرس محدد. | |||
===<code>[[Ruby/Array/index_operator|[]]]</code>=== | |||
يجلب عنصرًا ذي فهرس محدد، أو جزءًا محددًا ببداية وطول، أو مجالًا محددًا ببداية ونهاية من مصفوفة. | |||
===<code>[[Ruby/Array/new|new]]</code>=== | |||
ينشئ مصفوفةً جديدةً. | |||
===<code>[[Ruby/Array/Array|Array]]</code>=== | |||
ينشئ مصفوفةً جديدةً تحوي الكائنات المُمرّرة إليها. | |||
===<code>[[Ruby/Array/try_convert|try_convert]]</code>=== | |||
يحوّل كائنًا إلى مصفوفة بالاستعانة بالتابع <nowiki/>[[Ruby/Array/to ary|<code>to_ary</code>]]. | |||
== توابع النسخة العامة (Public Instance Methods) == | |||
بشكل | ===<code>[[Ruby/Array/and|&]]</code>=== | ||
يعيد مصفوفةً جديدةً تحتوي على العناصر المشتركة بين مصفوفتين دون تكرارها. | |||
==مصادر== | |||
* صفحة الصنف Array في توثيق روبي الرسمي. | ===<code>[[Ruby/Array/union|<nowiki>|</nowiki>]]</code>=== | ||
يجمع عناصر مصفوفتين في مصفوفة واحدة جديدة مع استثناء العناصر المتكررة والحفاظ على ترتيب العناصر وفقًا للمصفوفة الأولى المعطاة. | |||
===<code>[[Ruby/Array/star|*]]</code>=== | |||
إن استعمل مع مصفوفة وسلسلة نصية، فسيُكافئ حينئذٍ العبارة <code>[[Ruby/Array/join|ary.join(str)]]</code>. | |||
===<code>[[Ruby/Array/plus|+]]</code>=== | |||
يجمع مصفوفتين معًا في مصفوفة واحدة جديدة. | |||
===<code>[[Ruby/Array/minus|-]]</code>=== | |||
يعيد مصفوفة جديدة تمثل نسخة من جميع عناصر المصفوفة الأصلية باستثناء العناصر المشتركة مع المصفوفة الأخرى. | |||
===<code>[[Ruby/Array/append_operator|>>]]</code>=== | |||
يضيف كائنًا مُحدَّدًا إلى نهاية المصفوفة الأصلية ثم يعيد المصفوفة نفسها، لذا يمكن تكرار هذا المعامل عدة مرات وبشكل متسلسل. | |||
===<code>[[Ruby/Array/Comparison|<=>]]</code>=== | |||
يعيد عددًا صحيحًا (<code>-1</code> أو <code>0</code> أو <code>+1</code>) إذا كانت المصفوفة الأصلية أصغر من أو تساوي أو أكبر من المصفوفة الأخرى المعطاة على التوالي. يوازن كل كائن من كل مصفوفة باستخدام المعامل <code><=></code>. | |||
===<code>[[Ruby/Array/equal|==]]</code>=== | |||
يتحقق من تساوي مصفوفتين مع بعضهما بعضًا. | |||
===<code>[[Ruby/Array/any|any?]]</code>=== | |||
يتحقق إذا كان كل عنصر من عناصر المصفوفة المعطاة محققًا لشرط منطقي محدد أو كانت قيمة كل عنصر لا تساوي القيمة <code>false.</code> | |||
=== <code>[[Ruby/Array/append|append]]</code> === | |||
يعدُّ التابع <code>append</code> اسمًا بديلًا للتابع <code>[[Ruby/Array/push|push]]</code>. | |||
===<code>[[Ruby/Array/assoc|assoc]]</code>=== | |||
يبحث في العناصر الأولى للمصفوفات الفرعية الموجودة في المصفوفة المستدعاة معه عن الكائن المُمرّر إليها ثم يعيد المصفوفة الفرعية الأولى التي يكون أول عنصر فيها هو ذلك الكائن، أو يعيد القيمة <code>nil</code> في حالة عدم العثور على ذلك الكائن. | |||
===<code>[[Ruby/Array/at|at]]</code>=== | |||
يجلب عنصرًا ذا فهرس محدد من المصفوفة المستدعاة معه. | |||
===<code>[[Ruby/Array/bsearch|bsearch]]</code>=== | |||
يبحث باستخدام البحث الثنائي (binary search) عن قيمة من مصفوفة تحقق شرطًا منطقيًّا محددًا ويستغرق <code>O(log n)</code>، إذ <code>n</code> حجم المصفوفة. | |||
===<code>[[Ruby/Array/bsearch_index|bsearch_index]]</code>=== | |||
يبحث باستخدام البحث الثنائي (binary search) عن فهرسٍ لعنصر من مصفوفة يحقق شرطًا منطقيًّا محددًا ويستغرق <code>O(log n)</code>، إذ <code>n</code> هي حجم المصفوفة. | |||
===<code>[[Ruby/Array/clear|clear]]</code>=== | |||
يزيل كل عناصر المصفوفة. | |||
===<code>[[Ruby/Array/collect|collect]]</code>=== | |||
يستدعي كتلة برمجية محدَّدة مع كل عنصر من عناصر مصفوفة ثمَّ يعيد مصفوفة جديدة تحوي القيم التي تعيدها تلك الكتلة. | |||
===<code>[[Ruby/Array/!collect|!collect]]</code>=== | |||
يستدعي كتلة برمجية محددة مع كل عنصر من عناصر مصفوفة ثم يضع القيمة التي أعادتها تلك الكتلة مكان العنصر الذي استدعيت معه. | |||
===<code>[[Ruby/Array/combination|combination]]</code>=== | |||
يجمِّععناصر المصفوفة المعطاة مع بعضها بعضًا في مصفوفات بطول يساوي القيمة <code>n</code> الممررة إليه ثم يضع هذه المصفوفات في المصفوفة نفسها المعطاة ويعيدها. لا يوجد أي ضمان للتنبؤ بترتيب العناصر المجمَّعة المعادة. | |||
===<code>[[Ruby/Array/compact|compact]]</code>=== | |||
يعيد نسخةً جديدة من المصفوفة التي استُدعي معها مع حذف كل العناصر التي تساوي <code>nil</code> منها. | |||
===<code>[[Ruby/Array/compact!|compact!]]</code>=== | |||
يحذف كل العناصر ذات القيمة <code>nil</code> من المصفوفة التي استدعيت معه ثم يعيدها. إن لم تحوي المصفوفة أي عنصر يساوي <code>nil</code>، فسيعيد التابع <code>compact!</code> القيمة <code>nil</code>. | |||
===<code>[[Ruby/Array/concat|concat]]</code>=== | |||
يضيف جميع عناصر المصفوفات المُمرّرة إليه إلى المصفوفة التي استُدعيت معه. | |||
===<code>[[Ruby/Array/count|count]]</code>=== | |||
يعيد عدد عناصر المصفوفة التي استُدعيت معه أو عدد العناصر المتساوية مع قيمة معينة (يتحقق من ذلك باستعمال المعامل <code>[[Ruby/Array/equal|==]]</code>) أو عدد العناصر التي تحقق شرطًا محددًا. | |||
===<code>[[Ruby/Array/cycle|cycle]]</code>=== | |||
يستدعي كتلة برمجية محددة مع كل عنصر من عناصر المصفوفة عددًا محددًا من المرات أو عددًا لا نهائيًّا من المرات إن أعطيت القيمة <code>nil</code>. أمَّا إن مُرِّرت إليه قيمة سالبة أو كانت المصفوفة فارغة، فلن يفعل هذا التابع أي شيء. يعيد التابع القيمة <code>nil</code> إن انتهت سلسلة الاستدعاءات المطبقة على كل عنصر دون مقاطعة.إن لم تمرَّر أي كتلة، فسيعيد التابع <code>cycle</code> كائنا من النوع <code>Enumerator</code>. | |||
===<code>[[Ruby/Array/delete|delete]]</code>=== | |||
يحذف جميع عناصر المصفوفة المساوية لقيمة محددة ثم يعيد آخر عنصر حذفه، أو القيمة <code>nil</code> أو ناتج تطبيق كتلة برمجية محددة إن لم يعثر على أي عنصر لحذفه. | |||
===<code>[[Ruby/Array/delete_at|delete_at]]</code>=== | |||
يحذف عنصرًا ذا فهرس محدَّد من مصفوفة. | |||
===<code>[[Ruby/Array/delete_if|delete_if]]</code>=== | |||
يحذف جميع عناصر المصفوفة التي تعيد الكتلة البرمجية المعطاة عند تطبيقها على كل عنصر منها القيمة <code>true</code>. | |||
===<code>[[Ruby/Array/dig|dig]]</code>=== | |||
يستخرج العنصر المتشعِّب (nested value) المحدَّد بسلسلة المعاملات الممرَّرة إليه من مصفوفة متعددة الأبعاد وذلك عبر استدعاء <code>dig</code> عند كل مستوى تشعب. | |||
===<code>[[Ruby/Array/drop|drop]]</code>=== | |||
يحذف أول <code>n</code> عنصر من مصفوفة ثمَّ يضع بقية العناصر في مصفوفة جديدة ويعيدها. | |||
===<code>[[Ruby/Array/drop_while|drop_while]]</code>=== | |||
يحذف عناصر المصفوفة الأولى التي تحقِّق شرطًا محدَّدًا ثمَّ يعيد مصفوفة جديدة تحوي بقية العناصر. | |||
===<code>[[Ruby/Array/each|each]]</code>=== | |||
يستدعي كتلة برمجية محدَّدة مع كل عنصر من عناصر مصفوفة، إذ تمرَّر قيمة ذلك العنصر كوسيط إلى الكتلة ثمَّ يعيد المصفوفة نفسها المعطاة. | |||
===<code>[[Ruby/Array/eql| eql?]]</code>=== | |||
يتحقق من أن مصفوفتين تتضمنان نفس العناصر، وذلك بحسب التابع <code>Object.eql?.</code> | |||
===<code>[[Ruby/Array/each_index|each_index]]</code>=== | |||
يستدعي كتلة برمجية محددة مع فهرس كل عنصر من عناصر مصفوفة، إذ يُمرَّر ذلك الفهرس كوسيط إلى الكتلة ثم يعيد المصفوفة نفسها. | |||
===<code>[[Ruby/Array/empty|empty?]]</code>=== | |||
يتحقق إن كانت مصفوفةٌ فارغةً أم لا. | |||
===<code>[[Ruby/Array/fetch|fetch]]</code>=== | |||
يجلب عنصرًا ذا فهرس محدَّد من مصفوفة. إن كان الفهرس المعطى لعنصرٍ يقع خارج نطاق المصفوفة، فسيُطلَق الخطأ <code>IndexError</code>. | |||
===<code>[[Ruby/Array/fill|fill]]</code>=== | |||
يضبط قيم عناصر محدَّدة أو جميع عناصر مصفوفة إلى القيمة الممرَّرة إليه (الأشكال الثلاث الأولى للتابع في قسم «البنية العامة»)، أو القيم التي تعيدها الكتلة البرمجية الممرَّرة إليه (الأشكال الثلاث المتبقية). | |||
===<code>[[Ruby/Array/find_index|find_index]]</code>=== | |||
يجلب فهرس أول ظهور لعنصر محدَّد من مصفوفة أو فهرس أول عنصر يحقق شرطًا محدَّدًا. | |||
===<code>[[Ruby/Array/first|first]]</code>=== | |||
يجلب أول عنصر أو أول <code>n</code> عنصر من مصفوفة. | |||
===<code>[[Ruby/Array/flatten|flatten]]</code>=== | |||
يجعل المصفوفة التي تحوي عناصر متشعبة ضمنها مصفوفةً أحادية البعد بشكل تعاودي (recursively)؛ أي أنَّ كل عنصر من عناصر المصفوفة المعطاة والذي قد يكون نفسه مصفوفةً متشعبةً من مستوًى واحدٍ أو أكثر ستُستخلَص عناصره وتضاف إلى مصفوفة جديدة. | |||
===<code>[[Ruby/Array/flatten!|flatten!]]</code>=== | |||
يشبه التابع<nowiki/>[[Ruby/Array/flatten| <code>flatten</code>]] في جميع النواحي باستثناء أنه لا يضع الناتج في مصفوفة جديدة وإنما يعدِّل على المصفوفة الأصلية نفسها. | |||
===<code>[[Ruby/Array/frozen|frozen?]]</code>=== | |||
يتحقق إن كانت مصفوفةٌ مُجمَّدةً (frozen) بشكل دائم أو مؤقت إلى حين إعادة ترتيبها. | |||
===<code>[[Ruby/Array/hash|hash]]</code>=== | |||
يعيد القيمة Hash للمصفوفة التي استُدعيت معه. | |||
===<code>[[Ruby/Array/include|include?]]</code>=== | |||
يتحقق إن كان العنصر المُمرّر إليه موجودًا في المصفوفة التي استُدعيت معه (أي إذا كان هنالك عنصر من المصفوفة يساوي الوسيط الممرر بحسب المعامل <code>[[Ruby/Array/equal|==]]</code>). | |||
===<code>[[Ruby/Array/index|index]]</code>=== | |||
يجلب فهرس أول ظهور لعنصر محدَّد من مصفوفة (يتحقق من التساوي باستعمال المعامل <code>[[Ruby/Array/equal|==]]</code>) أو فهرس أول عنصر يحقق شرطًا محدَّدًا. | |||
===<code>[[Ruby/Array/initialize_copy|initialize_copy]]</code>=== | |||
يبدل محتوى المصفوفة المُمرّرة إليه مكان محتوى المصفوفة التي استُدعيت معه مع تغيير طول المصفوفة عند الضرورة. | |||
===<code>[[Ruby/Array/insert|insert]]</code>=== | |||
يُدرج القيم المُمرّرة إليه قبل عنصرٍ ذي فهرس محدد. | |||
===<code>[[Ruby/Array/inspect|inspect]]</code>=== | |||
يحول مصفوفةً إلى سلسلة نصية. | |||
===<code>[[Ruby/Array/join|join]]</code>=== | |||
يجمع جميع عناصر المصفوفة التي استُدعيت معها سويةً في سلسلة نصية ويفصل بينها بفاصل معين. | |||
===<code>[[Ruby/Array/keep_if|keep_if]]</code>=== | |||
يٌبقِي على جميع عناصر المصفوفة التي تحقق شرطًا معينًا ويحذف العناصر الأخرى المتبقية. | |||
===<code>[[Ruby/Array/last|last]]</code>=== | |||
يجلب آخر عنصر أو آخر <code>n</code> عنصر من مصفوفة. | |||
===<code>[[Ruby/Array/length|length]]</code>=== | |||
يعيد عدد عناصر المصفوفة التي استُدعيت معه. | |||
===<code>[[Ruby/Array/map|map]]</code>=== | |||
يستدعي كتلة برمجية محدَّدة مع كل عنصر من عناصر مصفوفة ثمَّ يضع الناتج الذي تعيده هذه الكتلة لكل عنصر في مصفوفة جديدة وتعيدها. | |||
===<code>[[Ruby/Array/!map|!map]]</code>=== | |||
يستدعي كتلة برمجية محدَّدة مع كل عنصر من عناصر مصفوفة ثمَّ يضع القيمة التي أعادتها تلك الكتلة مكان العنصر الذي طُبِّقَت عليه. | |||
===<code>[[Ruby/Array/max|max]]</code>=== | |||
يعيد أكبر عنصر موجود في المصفوفة التي استُدعيت معه. | |||
===<code>[[Ruby/Array/min|min]]</code>=== | |||
يعيد أصغر عنصر موجود في المصفوفة التي استُدعيت معه. | |||
===<code>[[Ruby/Array/pack|pack]]</code>=== | |||
يُحزِّمُ (packs) محتويات المصفوفة التي استُدعيت معه على شكل تسلسل ثنائي (binary sequence) وفقًا للمُوجِّهات (directives) الواردة في المعامل <code>aTemplateString</code>؛ | |||
===<code>[[Ruby/Array/permutation|permutation]]</code>=== | |||
يعيد كل التبديلات (permutations) الممكنة لجميع عناصر مصفوفة، | |||
===<code>[[Ruby/Array/pop|pop]]</code>=== | |||
يحذف آخر عنصر أو آخر <code>n</code> عنصر من مصفوفة ثم يعيده أو يعيدها في مصفوفة جديدة. | |||
===<code>[[Ruby/Array/prepend|prepend]]</code>=== | |||
يعدُّ هذا التابع اسمًا بديلًا للتابع<nowiki/>[[Ruby/Array/unshift| <code>unshift</code>]]. | |||
===<code>[[Ruby/Array/product|product]]</code>=== | |||
يوزِّع عناصر المصفوفة التي استدعيت معه على جميع عناصر المصفوفات الممرَّرة إليه. | |||
===<code>[[Ruby/Array/push|push]]</code>=== | |||
يضيف جميع الكائنات المُمرّرة إليه إلى نهاية المصفوفة التي استُدعيت معه. | |||
===<code>[[Ruby/Array/rassoc|rassoc]]</code>=== | |||
يبحث عن عنصر محدد في العناصر الثانية للمصفوفات الفرعية الموجودة في المصفوفة المستدعاة معه ثم يعيد المصفوفة الفرعية التي يُعثَر فيها على ذلك العنصر. | |||
===<code>[[Ruby/Array/reject|reject]]</code>=== | |||
يعيد مصفوفة جديدة تحتوي جميع عناصر المصفوفة التي استُدعيت معها والتي لم تحقق شرطًا محددًا. يُحافَظ على ترتيب العناصر المرفوضة المعادة بنفس ترتيبها كما كانت في المصفوفة الأصلية. | |||
===<code>[[Ruby/Array/reject!|reject!]]</code>=== | |||
يحذف جميع عناصر المصفوفة التي لم تحقق شرطًا محددًا. | |||
===<code>[[Ruby/Array/repeated_combination|repeated_combination]]</code>=== | |||
يشبه التابع<nowiki/>[[Ruby/Array/combination| <code>combination</code>]] باستثناء أنه يمكنه تجميع العناصر مع نفسها (أي تكرار العناصر نفسها). لا يوجد أي ضمان للتنبؤ بترتيب العناصر المجمَّعة المعادة. | |||
===<code>[[Ruby/Array/repeated_permutation|repeated_permutation]]</code>=== | |||
يشبه التابع<nowiki/>[[Ruby/Array/permutation| <code>permutation</code>]] باستثناء أنَّه يستطيع إنشاء تبديلات للعناصر مع نفسها (أي تكرار العناصر نفسها) وأنه لا يمكن استدعاؤه دون تمرير عدد العناصر المراد التبديل بينها إليه. لا يوجد أي ضمان للتنبؤ بترتيب العناصر المعادة. | |||
===<code>[[Ruby/Array/replace|replace]]</code>=== | |||
يبدِّل محتوى المصفوفة الممرَّرة إليه مكان محتوى المصفوفة المستدعاة معه مع تغيير طولها إن دعت الحاجة لذلك. | |||
===<code>[[Ruby/Array/reverse|reverse]]</code>=== | |||
يعكس ترتيب عناصر المصفوفة التي استُدعيت معه ويضعها في مصفوفة جديدة. | |||
===<code>[[Ruby/Array/reverse!|reverse!]]</code>=== | |||
يعكس ترتيب عناصر المصفوفة التي استُدعيت معه. | |||
===<code>[[Ruby/Array/reverse_each|reverse_each]]</code>=== | |||
يشبه التابع<nowiki/>[[Ruby/Array/each| <code>each</code>]] تمامًا باستثناء أنَّه يطبق الكتلة البرمجية على العناصر بدءًا من العنصر الأخير وحتى العنصر الأول. | |||
===<code>[[Ruby/Array/rindex|rindex]]</code>=== | |||
يجلب فهرس آخر ظهور لعنصر محدَّد من مصفوفة (يتحقق من التساوي باستعمال المعامل <code>[[Ruby/Array/equal|==]]</code>) أو فهرس آخر عنصر يحقق شرطًا محدَّدًا. | |||
===<code>[[Ruby/Array/rotate|rotate]]</code>=== | |||
يعيد مصفوفة جديدة تحتوي عناصر المصفوفة التي استُدعيت معها مع إزاحة (تدوير) عناصرها ليكون العنصر ذو الفهرس الممرر إليها هو العنصر الأول في المصفوفة الجديدة. | |||
===<code>[[Ruby/Array/rotate!|rotate!]]</code>=== | |||
يُدوّر عناصر المصفوفة التي استُدعيت معه ليكون العنصر ذو الفهرس الممرَّر إليها هو العنصر الأول. | |||
===<code>[[Ruby/Array/sample|sample]]</code>=== | |||
يختار عنصرًا واحدًا أو عدة عناصر بشكل عشوائي من المصفوفة التي استُدعيت معه. | |||
===<code>[[Ruby/Array/select|select]]</code>=== | |||
يحدد جميع عناصر المصفوفة المحققة لشرط معين ويضعها في مصفوفة جديدة. | |||
===<code>[[Ruby/Array/select!|select!]]</code>=== | |||
يختار جميع عناصر المصفوفة المحققة لشرط معين ويحذف العناصر الأخرى المتبقية التي لم تحقق هذا الشرط. | |||
===<code>[[Ruby/Array/shift|shift]]</code>=== | |||
يحذف أول عنصر أو أول <code>n</code> عنصر من عناصر مصفوفة ثم يعيده أو يعيد مصفوفة تحوي العناصر المحذوفة. | |||
===<code>[[Ruby/Array/shuffle|shuffle]]</code>=== | |||
يعيد ترتيب عناصر مصفوفة بشكل عشوائي ثم يضعها في مصفوفة جديدة. | |||
===<code>[[Ruby/Array/shuffle!|shuffle!]]</code>=== | |||
يعيد ترتيب عناصر مصفوفة بشكل عشوائي. | |||
===<code>[[Ruby/Array/size|size]]</code>=== | |||
يعدُّ هذا التابع اسمًا بديلًا للتابع<nowiki/>[[Ruby/Array/length| <code>length</code>]]. | |||
===<code>[[Ruby/Array/slice|slice]]</code>=== | |||
يجلب عنصرًا ذي فهرس محدد، أو جزءًا محددًا ببداية وطول، أو مجالًا محددًا ببداية ونهاية من مصفوفة. | |||
===<code>[[Ruby/Array/slice!|slice!]]</code>=== | |||
يقتطع عنصرًا ذي فهرس محدد، أو جزءًا محددًا ببداية وطول، أو مجالًا محددًا ببداية ونهاية من المصفوفة التي استدعيت معه. | |||
===<code>[[Ruby/Array/sort|sort]]</code>=== | |||
يرتب عناصر المصفوفة التي استُدعيت معه ويعيدها في مصفوفة جديدة. | |||
===<code>[[Ruby/Array/sort!|sort!]]</code>=== | |||
يرتب عناصر المصفوفة التي استُدعيت معه. | |||
===<code>[[Ruby/Array/sort_by!|sort_by!]]</code>=== | |||
يُرتِّب المصفوفة التي استُدعيت معه وفقًا لمجموعة من المفاتيح (set of keys) المولدة عبر تمرير كل عنصر من عناصر المصفوفة إلى كتلة برمجية مُحددة. | |||
===<code>[[Ruby/Array/sum|sum]]</code>=== | |||
يجمع عناصر المصفوفة التي استُدعيت معه مع بعضها بعضًا. | |||
===<code>[[Ruby/Array/take|take]]</code>=== | |||
يجلب أول <code>n</code> عنصر من مصفوفة. | |||
===<code>[[Ruby/Array/take_while|take_while]]</code>=== | |||
يجلب العناصر الأولى من مصفوفة التي تحقق شرطًا معينًا؛ أي يستمر التابع في جلب العناصر الأولى ما دامت محققة للشرط ويتوقف عندما لا يحقق أحد العناصر ذلك الشرط المعطى. | |||
===<code>[[Ruby/Array/to_a|to_a]]</code>=== | |||
يعيد المصفوفة التي استُدعيت معه. | |||
===<code>[[Ruby/Array/to_ary|to_ary]]</code>=== | |||
يعيد المصفوفة التي استُدعيت معه. | |||
===<code>[[Ruby/Array/to_h|to_h]]</code>=== | |||
يعيد التابع <code>to_h</code> نتيجة تحويل المصفوفة التي استُدعيت معه إلى مصفوفة مكونة من الأزواج <code>[key, value]</code>. | |||
===<code>[[Ruby/Array/to_s|to_s]]</code>=== | |||
يعدُّ اسمًا بديلًا للتابع<nowiki/>[[Ruby/Array/inspect| <code>inspect</code>]]. | |||
===<code>[[Ruby/Array/transpose|transpose]]</code>=== | |||
يفترض أنَّ المصفوفة التي استُدعيت معه مكونةٌ من مصفوفات فيعمل على قلب (transposes) الأعمدة إلى أسطر والأسطر إلى أعمدة. | |||
===<code>[[Ruby/Array/uniq|uniq]]</code>=== | |||
يحذف العناصر المتكررة من مصفوفة ثم يضع العناصر المتبقية في مصفوفة جديدة. | |||
===<code>[[Ruby/Array/uniq!|uniq!]]</code>=== | |||
يحذف العناصر المتكررة من مصفوفة. | |||
===<code>[[Ruby/Array/unshift|unshift]]</code>=== | |||
يضيف الكائنات المُمرَّرة إليه إلى بداية المصفوفة التي استُدعيت معه مع إزاحة العناصر الأخرى إلى الأمام. | |||
===<code>[[Ruby/Array/values_at|values_at]]</code>=== | |||
يجلب عنصرًا واحدًا أو أكثر ذا فهرس محدد من مصفوفة. | |||
===<code>[[Ruby/Array/zip|zip]]</code>=== | |||
يحول الوسائط الممرَّرة إليه إلى مصفوفات ثم يدمج عناصر المصفوفة التي استُدعيت معه مع العناصر المقابلة في الوسائط (المصفوفات) المُمرَّرة. | |||
== مصادر == | |||
* [https://ruby-doc.org/core-2.5.1/Array.html صفحة الصنف Array في توثيق روبي الرسمي.] |
المراجعة الحالية بتاريخ 12:21، 21 نوفمبر 2018
المصفوفات هي مجموعات مُرتَّبة ومُفهرسة بالأعداد الصحيحة (integer-indexed) ومُكونة من أي نوع من الكائنات.
تبدأ فهارس المصفوفات بالعدد 0
، كما هو الحال في لغتي C و Java. ويفترض أن يُحسب الفهرس السالب بدءًا من نهاية المصفوفة، أي أنَّ الفهرس ذا القيمة -1
يشير إلى العنصر الأخير في المصفوفة، والفهرس -2
يمثل موضع العنصر ما قبل الأخير، وهلم جرًا.
إنشاء المصفوفات
يمكن إنشاء مصفوفة جديدة باستخدام المعامل []
الباني.
يمكن أن تحتوي المصفوفة نفسها على أنواع مختلفة من الكائنات. على سبيل المثال، المصفوفة التالية تحتوي على عدد صحيح (Integer) وسلسلة نصية (String) وعدد عشري:
ary = [1, "two", 3.0] #=> [1, "two", 3.0]
كما يمكن إنشاء مصفوفة من خلال استدعاء التابع ::new
مباشرةً دون تمرير أية وسائط إليه، أو مع تمرير وسيط واحد (الذي يمثل الحجم الأولي للمصفوفة) أو وسيطين (الحجم الأولي والكائنات الافتراضية [default object]).
ary = Array.new #=> []
Array.new(3) #=> [nil, nil, nil]
Array.new(3, true) #=> [true, true, true]
لاحظ أنَّ الوسيط الثاني يملأ كامل المصفوفة بقيمة الكائن المعطى نفسه. بناءً على ذلك، يُنصح باستخدامه فقط في الحالات التي تحتاج فيها إلى إنشاء مصفوفات باستخدام كائنات غير قابلة للتغيير (immutable) مثل الرموز (Symbols) والأرقام والقيم المنطقية.
لإنشاء مصفوفة تحتوي كائنات مختلفة، فيمكن تمرير كتلة برمجية إلى التابع new
. هذه الطريقة آمنة للاستخدام مع الكائنات القابلة للتغيير (mutable) مثل الخرائط (hashes) أو السلاسل النصية (strings) أو مصفوفات أخرى:
Array.new(4) { Hash.new } #=> [{}, {}, {}, {}]
Array.new(4) {|i| i.to_s } #=> ["0", "1", "2", "3"]
هذه الطريقة مفيدة وسريعة لبناء مصفوفات متعددة الأبعاد (multi-dimensional arrays):
Array.new(4) { Hash.new } #=> [{}, {}, {}, {}]
Array.new(4) {|i| i.to_s } #=> ["0", "1", "2", "3"]
يمكن أيضًا إنشاء مصفوفة باستخدام التابع Array()
، والذي يستدعي التابع to_ary
ثم التابع to_a
مع الوسائط المُمرَّرة.
Array({:a => "a", :b => "b"}) #=> [[:a, "a"], [:b, "b"]]
التوابع المستعملة مع المصفوفات
بالإضافة إلى توابع الصنف Enumerable
، فإنّ للصنف Array
توابع خاصة به تستعمل في الوصول إلى المصفوفة والبحث فيها وغيرها من الأمور.
الوصول إلى العناصر
يمكن جلب عناصر من أي مصفوفة باستخدام معامل الفهرسة []
، إذ يمرَّر إلى هذا المعامل عددًا صحيحًا واحدًا (يمثل فهرس العنصر [index])، أو زوجًا من الأعداد (أحدهما يمثل بداية العنصر والأخر يمثل طول العناصر المراد جلبها)، أو مجالًا (يمثل بداية ونهاية العناصر المراد جلبها). إن أعطيت قيمة سالبة للفهرس، فسيُسحَب موضع العنصر بدءًا من نهاية المصفوفة؛ يمثل الفهرس -1
مثلًا موضع العنصر الأخير.
arr = [1, 2, 3, 4, 5, 6]
arr[2] #=> 3
arr[100] #=> nil
arr[-3] #=> 4
arr[2, 3] #=> [3, 4, 5]
arr[1..4] #=> [2, 3, 4, 5]
arr[1..-3] #=> [2, 3, 4]
هنالك طريقة أخرى للوصول إلى أحد عناصر مصفوفة وهي باستخدام التابع at
:
arr.at(0) #=> 1
أمَّا التابع slice
، فيعمل بطريقة مشابهة لمعامل الفهرسة []
.
إن أردت أن يُطلَق خطأٌ أو تُظهر رسالة أو قيمة معينة إذا أشار فهرسٌ إلى عنصر خارج المصفوفة، فيمكنك استخدام التابع fetch
.
arr = ['a', 'b', 'c', 'd', 'e', 'f']
arr.fetch(100) #=> IndexError: index 100 outside of array bounds: -6...6
arr.fetch(100, "oops") #=> "oops"
يجلب التابعان first
و last
العنصرين الأول والأخير من مصفوفة على التوالي.
arr.first #=> 1
arr.last #=> 6
للحصول على أول n
عنصر من مصفوفة، يمكن استخدام التابع take
:
arr.take(3) #=> [1, 2, 3]
يفعل التابع drop
بشكل معاكس لما يفعله التابع take
، إذ يعيد آخر n
عنصر من المصفوفة:
arr.drop(3) #=> [4, 5, 6]
الحصول على معلومات متعلقة بمصفوفة
تخزِّن المصفوفات طولها (عدد عناصرها [تدعى «حجم المصفوفة» في بعض الأحيان]) باستمرار. لمعرفة عدد عناصر أي مصفوفة، يمكن استخدام أحد التوابع length
أو count
أو size
:
browsers = ['Chrome', 'Firefox', 'Safari', 'Opera', 'IE']
browsers.length #=> 5
browsers.count #=> 5
للتحقق مما إذا كانت مصفوفة فارغة أم لا، يمكن استخدام التابع empty?
:
browsers.empty? #=> false
لمعرفة إذا كان عنصر معين موجودًا في مصفوفة، يمكن استخدام التابع include?
:
browsers.include?('Konqueror') #=> false
إضافة عناصر إلى المصفوفات
يمكن إضافة عناصر معينة إلى نهاية مصفوفة باستخدام إمَّا التابع push
أو المعامل <<
:
arr = [1, 2, 3, 4]
arr.push(5) #=> [1, 2, 3, 4, 5]
arr << 6 #=> [1, 2, 3, 4, 5, 6]
أمَّا التابع unshift
، فيضيف عنصرًا جديدًا إلى بداية المصفوفة.
arr.unshift(0) #=> [0, 1, 2, 3, 4, 5, 6]
يستعمل التابع insert
لإدراج عنصر جديد في المصفوفة في أي موضع فيها.
arr.insert(3, 'apple') #=> [0, 1, 2, 'apple', 3, 4, 5, 6]
ويستعمل التابع insert
أيضًا لإدراج عدة قيم في الوقت نفسه:
arr.insert(3, 'orange', 'pear', 'grapefruit')
#=> [0, 1, 2, "orange", "pear", "grapefruit", "apple", 3, 4, 5, 6]
إزالة عناصر من مصفوفة
يزيل التابع pop
العنصر الأخير من مصفوفة ثم يعيده:
arr = [1, 2, 3, 4, 5, 6]
arr.pop #=> 6
arr #=> [1, 2, 3, 4, 5]
لجلب العنصر الأول من مصفوفة وحذفه أيضًا منها في الوقت نفسه، استخدم التابع shift
:
arr.shift #=> 1
arr #=> [2, 3, 4, 5]
لحذف عنصر ذي فهرس محدد، يمكن استعمال التابع delete_at
:
arr.delete_at(2) #=> 4
arr #=> [2, 3, 5]
لحذف عنصر معين موجود في أي مكان في مصفوفة، يمكن استخدام التابع delete
:
arr = [1, 2, 2, 3]
arr.delete(2) #=> 2
arr #=> [1,3]
إن أردت إزالة كل القيم nil
من مصفوفة، فاستخدم التابع compact
:
arr = ['foo', 0, nil, 'bar', 7, 'baz', nil]
arr.compact #=> ['foo', 0, 'bar', 7, 'baz']
arr #=> ['foo', 0, nil, 'bar', 7, 'baz', nil]
arr.compact! #=> ['foo', 0, 'bar', 7, 'baz']
arr #=> ['foo', 0, 'bar', 7, 'baz']
لإزالة العناصر المتكررة من مصفوفة، يمكن استخدام إمَّا التابع uniq
الذي لا يغير المصفوفة (non-destructive) أو التابع uniq!
الذي يغير المصفوفة (destructive).
arr = [2, 5, 6, 556, 6, 6, 8, 9, 0, 123, 556]
arr.uniq #=> [2, 5, 6, 556, 8, 9, 0, 123]
تنفيذ عمليات تكرارية على المصفوفات
بشكل مشابه لكل الأصناف التي تشملها الوحدة Enumerable
، يملك الصنف Array
التابع each
الذي يحدد العناصر التي يراد التكرار عليها وما الذي سيطبق في كل عملية. في حالة التابع each
الخاص بالصنف Array
، كل عناصر المصفوفة تكون مشمولةً في تكرار تنفيذ كتل برمجية معطاة عليها.
لاحظ أنَّ هذه العملية لا تغير المصفوفة:
arr = [1, 2, 3, 4, 5]
arr.each { |a| print a -= 10, " " }
# prints: -9 -8 -7 -6 -5
#=> [1, 2, 3, 4, 5]
من التوابع المفيدة أيضًا التابع reverse_each
، الذي يشبه التابع each
تمامًا باستثناء أنه يكرّر (iterate) تنفيذ الكتلة البرمجية على عناصر المصفوفة بشكل معاكس أي يبدأ من العنصر الأخير وحتى العنصر الأول.
words = %w[first second third fourth fifth sixth]
str = ""
words.reverse_each { |word| str += "#{word} " }
p str #=> "sixth fifth fourth third second first "
يمكن استخدام التابع map
لإنشاء مصفوفة جديدة انطلاقًا من مصفوفة موجودة مسبقًا، إذ سيمرر كل عنصر من عناصر هذه المصفوفة إلى كتلة برمجية تعيد بدورها قيمة ما:
arr.map { |a| 2*a } #=> [2, 4, 6, 8, 10]
arr #=> [1, 2, 3, 4, 5]
arr.map! { |a| a**2 } #=> [1, 4, 9, 16, 25]
arr #=> [1, 4, 9, 16, 25]
اختيار عناصر محددة من مصفوفة
يمكن اختيار عناصر من مصفوفة وفقًا لمعايير محددة في كتلة برمجية (block). يمكن أن تجرى عملية الاختيار بطريقة هادمة (destructive) للمصفوفة الأصلية أو بطريقة غير هادمة (non-destructive)، إذ ستعدل العمليات الهادمة على المصفوفة الأصلية بينما تنشئ العمليات غير الهادمة مصفوفة جديدة تضع فيها العناصر الناتجة.
الاختيار غير الهادم (Non-destructive Selection)
مثالٌ على الاختيار غير الهادم الذي يجرى باستعمال التابع select
، والتابع reject
، والتابع drop_while
:
arr = [1, 2, 3, 4, 5, 6]
arr.select { |a| a > 3 } #=> [4, 5, 6]
arr.reject { |a| a < 3 } #=> [3, 4, 5, 6]
arr.drop_while { |a| a < 4 } #=> [4, 5, 6]
arr #=> [1, 2, 3, 4, 5, 6]
الاختيار الهادم (Destructive Selection)
يقابل التابعان select!
و reject!
الهادمان التابعين select
و reject
غير الهادمين.
بشكل مماثل للتابع select
والتابع reject
المعاكس له، يعطي التابعان delete_if
و keep_if
نتيجة معاكسة إن استعملت معهما الكتلة البرمجية نفسها:
arr.delete_if { |a| a < 4 } #=> [4, 5, 6]
arr #=> [4, 5, 6]
arr = [1, 2, 3, 4, 5, 6]
arr.keep_if { |a| a < 4 } #=> [1, 2, 3]
arr #=> [1, 2, 3]
توابع الصنف العامة (Public Class Methods)
[]
يعيّن قيمة عنصر ذي فهرس محدد.
[]
يجلب عنصرًا ذي فهرس محدد، أو جزءًا محددًا ببداية وطول، أو مجالًا محددًا ببداية ونهاية من مصفوفة.
new
ينشئ مصفوفةً جديدةً.
Array
ينشئ مصفوفةً جديدةً تحوي الكائنات المُمرّرة إليها.
try_convert
يحوّل كائنًا إلى مصفوفة بالاستعانة بالتابع to_ary
.
توابع النسخة العامة (Public Instance Methods)
&
يعيد مصفوفةً جديدةً تحتوي على العناصر المشتركة بين مصفوفتين دون تكرارها.
|
يجمع عناصر مصفوفتين في مصفوفة واحدة جديدة مع استثناء العناصر المتكررة والحفاظ على ترتيب العناصر وفقًا للمصفوفة الأولى المعطاة.
*
إن استعمل مع مصفوفة وسلسلة نصية، فسيُكافئ حينئذٍ العبارة ary.join(str)
.
+
يجمع مصفوفتين معًا في مصفوفة واحدة جديدة.
-
يعيد مصفوفة جديدة تمثل نسخة من جميع عناصر المصفوفة الأصلية باستثناء العناصر المشتركة مع المصفوفة الأخرى.
>>
يضيف كائنًا مُحدَّدًا إلى نهاية المصفوفة الأصلية ثم يعيد المصفوفة نفسها، لذا يمكن تكرار هذا المعامل عدة مرات وبشكل متسلسل.
<=>
يعيد عددًا صحيحًا (-1
أو 0
أو +1
) إذا كانت المصفوفة الأصلية أصغر من أو تساوي أو أكبر من المصفوفة الأخرى المعطاة على التوالي. يوازن كل كائن من كل مصفوفة باستخدام المعامل <=>
.
==
يتحقق من تساوي مصفوفتين مع بعضهما بعضًا.
any?
يتحقق إذا كان كل عنصر من عناصر المصفوفة المعطاة محققًا لشرط منطقي محدد أو كانت قيمة كل عنصر لا تساوي القيمة false.
append
يعدُّ التابع append
اسمًا بديلًا للتابع push
.
assoc
يبحث في العناصر الأولى للمصفوفات الفرعية الموجودة في المصفوفة المستدعاة معه عن الكائن المُمرّر إليها ثم يعيد المصفوفة الفرعية الأولى التي يكون أول عنصر فيها هو ذلك الكائن، أو يعيد القيمة nil
في حالة عدم العثور على ذلك الكائن.
at
يجلب عنصرًا ذا فهرس محدد من المصفوفة المستدعاة معه.
bsearch
يبحث باستخدام البحث الثنائي (binary search) عن قيمة من مصفوفة تحقق شرطًا منطقيًّا محددًا ويستغرق O(log n)
، إذ n
حجم المصفوفة.
bsearch_index
يبحث باستخدام البحث الثنائي (binary search) عن فهرسٍ لعنصر من مصفوفة يحقق شرطًا منطقيًّا محددًا ويستغرق O(log n)
، إذ n
هي حجم المصفوفة.
clear
يزيل كل عناصر المصفوفة.
collect
يستدعي كتلة برمجية محدَّدة مع كل عنصر من عناصر مصفوفة ثمَّ يعيد مصفوفة جديدة تحوي القيم التي تعيدها تلك الكتلة.
!collect
يستدعي كتلة برمجية محددة مع كل عنصر من عناصر مصفوفة ثم يضع القيمة التي أعادتها تلك الكتلة مكان العنصر الذي استدعيت معه.
combination
يجمِّععناصر المصفوفة المعطاة مع بعضها بعضًا في مصفوفات بطول يساوي القيمة n
الممررة إليه ثم يضع هذه المصفوفات في المصفوفة نفسها المعطاة ويعيدها. لا يوجد أي ضمان للتنبؤ بترتيب العناصر المجمَّعة المعادة.
compact
يعيد نسخةً جديدة من المصفوفة التي استُدعي معها مع حذف كل العناصر التي تساوي nil
منها.
compact!
يحذف كل العناصر ذات القيمة nil
من المصفوفة التي استدعيت معه ثم يعيدها. إن لم تحوي المصفوفة أي عنصر يساوي nil
، فسيعيد التابع compact!
القيمة nil
.
concat
يضيف جميع عناصر المصفوفات المُمرّرة إليه إلى المصفوفة التي استُدعيت معه.
count
يعيد عدد عناصر المصفوفة التي استُدعيت معه أو عدد العناصر المتساوية مع قيمة معينة (يتحقق من ذلك باستعمال المعامل ==
) أو عدد العناصر التي تحقق شرطًا محددًا.
cycle
يستدعي كتلة برمجية محددة مع كل عنصر من عناصر المصفوفة عددًا محددًا من المرات أو عددًا لا نهائيًّا من المرات إن أعطيت القيمة nil
. أمَّا إن مُرِّرت إليه قيمة سالبة أو كانت المصفوفة فارغة، فلن يفعل هذا التابع أي شيء. يعيد التابع القيمة nil
إن انتهت سلسلة الاستدعاءات المطبقة على كل عنصر دون مقاطعة.إن لم تمرَّر أي كتلة، فسيعيد التابع cycle
كائنا من النوع Enumerator
.
delete
يحذف جميع عناصر المصفوفة المساوية لقيمة محددة ثم يعيد آخر عنصر حذفه، أو القيمة nil
أو ناتج تطبيق كتلة برمجية محددة إن لم يعثر على أي عنصر لحذفه.
delete_at
يحذف عنصرًا ذا فهرس محدَّد من مصفوفة.
delete_if
يحذف جميع عناصر المصفوفة التي تعيد الكتلة البرمجية المعطاة عند تطبيقها على كل عنصر منها القيمة true
.
dig
يستخرج العنصر المتشعِّب (nested value) المحدَّد بسلسلة المعاملات الممرَّرة إليه من مصفوفة متعددة الأبعاد وذلك عبر استدعاء dig
عند كل مستوى تشعب.
drop
يحذف أول n
عنصر من مصفوفة ثمَّ يضع بقية العناصر في مصفوفة جديدة ويعيدها.
drop_while
يحذف عناصر المصفوفة الأولى التي تحقِّق شرطًا محدَّدًا ثمَّ يعيد مصفوفة جديدة تحوي بقية العناصر.
each
يستدعي كتلة برمجية محدَّدة مع كل عنصر من عناصر مصفوفة، إذ تمرَّر قيمة ذلك العنصر كوسيط إلى الكتلة ثمَّ يعيد المصفوفة نفسها المعطاة.
eql?
يتحقق من أن مصفوفتين تتضمنان نفس العناصر، وذلك بحسب التابع Object.eql?.
each_index
يستدعي كتلة برمجية محددة مع فهرس كل عنصر من عناصر مصفوفة، إذ يُمرَّر ذلك الفهرس كوسيط إلى الكتلة ثم يعيد المصفوفة نفسها.
empty?
يتحقق إن كانت مصفوفةٌ فارغةً أم لا.
fetch
يجلب عنصرًا ذا فهرس محدَّد من مصفوفة. إن كان الفهرس المعطى لعنصرٍ يقع خارج نطاق المصفوفة، فسيُطلَق الخطأ IndexError
.
fill
يضبط قيم عناصر محدَّدة أو جميع عناصر مصفوفة إلى القيمة الممرَّرة إليه (الأشكال الثلاث الأولى للتابع في قسم «البنية العامة»)، أو القيم التي تعيدها الكتلة البرمجية الممرَّرة إليه (الأشكال الثلاث المتبقية).
find_index
يجلب فهرس أول ظهور لعنصر محدَّد من مصفوفة أو فهرس أول عنصر يحقق شرطًا محدَّدًا.
first
يجلب أول عنصر أو أول n
عنصر من مصفوفة.
flatten
يجعل المصفوفة التي تحوي عناصر متشعبة ضمنها مصفوفةً أحادية البعد بشكل تعاودي (recursively)؛ أي أنَّ كل عنصر من عناصر المصفوفة المعطاة والذي قد يكون نفسه مصفوفةً متشعبةً من مستوًى واحدٍ أو أكثر ستُستخلَص عناصره وتضاف إلى مصفوفة جديدة.
flatten!
يشبه التابع flatten
في جميع النواحي باستثناء أنه لا يضع الناتج في مصفوفة جديدة وإنما يعدِّل على المصفوفة الأصلية نفسها.
frozen?
يتحقق إن كانت مصفوفةٌ مُجمَّدةً (frozen) بشكل دائم أو مؤقت إلى حين إعادة ترتيبها.
hash
يعيد القيمة Hash للمصفوفة التي استُدعيت معه.
include?
يتحقق إن كان العنصر المُمرّر إليه موجودًا في المصفوفة التي استُدعيت معه (أي إذا كان هنالك عنصر من المصفوفة يساوي الوسيط الممرر بحسب المعامل ==
).
index
يجلب فهرس أول ظهور لعنصر محدَّد من مصفوفة (يتحقق من التساوي باستعمال المعامل ==
) أو فهرس أول عنصر يحقق شرطًا محدَّدًا.
initialize_copy
يبدل محتوى المصفوفة المُمرّرة إليه مكان محتوى المصفوفة التي استُدعيت معه مع تغيير طول المصفوفة عند الضرورة.
insert
يُدرج القيم المُمرّرة إليه قبل عنصرٍ ذي فهرس محدد.
inspect
يحول مصفوفةً إلى سلسلة نصية.
join
يجمع جميع عناصر المصفوفة التي استُدعيت معها سويةً في سلسلة نصية ويفصل بينها بفاصل معين.
keep_if
يٌبقِي على جميع عناصر المصفوفة التي تحقق شرطًا معينًا ويحذف العناصر الأخرى المتبقية.
last
يجلب آخر عنصر أو آخر n
عنصر من مصفوفة.
length
يعيد عدد عناصر المصفوفة التي استُدعيت معه.
map
يستدعي كتلة برمجية محدَّدة مع كل عنصر من عناصر مصفوفة ثمَّ يضع الناتج الذي تعيده هذه الكتلة لكل عنصر في مصفوفة جديدة وتعيدها.
!map
يستدعي كتلة برمجية محدَّدة مع كل عنصر من عناصر مصفوفة ثمَّ يضع القيمة التي أعادتها تلك الكتلة مكان العنصر الذي طُبِّقَت عليه.
max
يعيد أكبر عنصر موجود في المصفوفة التي استُدعيت معه.
min
يعيد أصغر عنصر موجود في المصفوفة التي استُدعيت معه.
pack
يُحزِّمُ (packs) محتويات المصفوفة التي استُدعيت معه على شكل تسلسل ثنائي (binary sequence) وفقًا للمُوجِّهات (directives) الواردة في المعامل aTemplateString
؛
permutation
يعيد كل التبديلات (permutations) الممكنة لجميع عناصر مصفوفة،
pop
يحذف آخر عنصر أو آخر n
عنصر من مصفوفة ثم يعيده أو يعيدها في مصفوفة جديدة.
prepend
يعدُّ هذا التابع اسمًا بديلًا للتابع unshift
.
product
يوزِّع عناصر المصفوفة التي استدعيت معه على جميع عناصر المصفوفات الممرَّرة إليه.
push
يضيف جميع الكائنات المُمرّرة إليه إلى نهاية المصفوفة التي استُدعيت معه.
rassoc
يبحث عن عنصر محدد في العناصر الثانية للمصفوفات الفرعية الموجودة في المصفوفة المستدعاة معه ثم يعيد المصفوفة الفرعية التي يُعثَر فيها على ذلك العنصر.
reject
يعيد مصفوفة جديدة تحتوي جميع عناصر المصفوفة التي استُدعيت معها والتي لم تحقق شرطًا محددًا. يُحافَظ على ترتيب العناصر المرفوضة المعادة بنفس ترتيبها كما كانت في المصفوفة الأصلية.
reject!
يحذف جميع عناصر المصفوفة التي لم تحقق شرطًا محددًا.
repeated_combination
يشبه التابع combination
باستثناء أنه يمكنه تجميع العناصر مع نفسها (أي تكرار العناصر نفسها). لا يوجد أي ضمان للتنبؤ بترتيب العناصر المجمَّعة المعادة.
repeated_permutation
يشبه التابع permutation
باستثناء أنَّه يستطيع إنشاء تبديلات للعناصر مع نفسها (أي تكرار العناصر نفسها) وأنه لا يمكن استدعاؤه دون تمرير عدد العناصر المراد التبديل بينها إليه. لا يوجد أي ضمان للتنبؤ بترتيب العناصر المعادة.
replace
يبدِّل محتوى المصفوفة الممرَّرة إليه مكان محتوى المصفوفة المستدعاة معه مع تغيير طولها إن دعت الحاجة لذلك.
reverse
يعكس ترتيب عناصر المصفوفة التي استُدعيت معه ويضعها في مصفوفة جديدة.
reverse!
يعكس ترتيب عناصر المصفوفة التي استُدعيت معه.
reverse_each
يشبه التابع each
تمامًا باستثناء أنَّه يطبق الكتلة البرمجية على العناصر بدءًا من العنصر الأخير وحتى العنصر الأول.
rindex
يجلب فهرس آخر ظهور لعنصر محدَّد من مصفوفة (يتحقق من التساوي باستعمال المعامل ==
) أو فهرس آخر عنصر يحقق شرطًا محدَّدًا.
rotate
يعيد مصفوفة جديدة تحتوي عناصر المصفوفة التي استُدعيت معها مع إزاحة (تدوير) عناصرها ليكون العنصر ذو الفهرس الممرر إليها هو العنصر الأول في المصفوفة الجديدة.
rotate!
يُدوّر عناصر المصفوفة التي استُدعيت معه ليكون العنصر ذو الفهرس الممرَّر إليها هو العنصر الأول.
sample
يختار عنصرًا واحدًا أو عدة عناصر بشكل عشوائي من المصفوفة التي استُدعيت معه.
select
يحدد جميع عناصر المصفوفة المحققة لشرط معين ويضعها في مصفوفة جديدة.
select!
يختار جميع عناصر المصفوفة المحققة لشرط معين ويحذف العناصر الأخرى المتبقية التي لم تحقق هذا الشرط.
shift
يحذف أول عنصر أو أول n
عنصر من عناصر مصفوفة ثم يعيده أو يعيد مصفوفة تحوي العناصر المحذوفة.
shuffle
يعيد ترتيب عناصر مصفوفة بشكل عشوائي ثم يضعها في مصفوفة جديدة.
shuffle!
يعيد ترتيب عناصر مصفوفة بشكل عشوائي.
size
يعدُّ هذا التابع اسمًا بديلًا للتابع length
.
slice
يجلب عنصرًا ذي فهرس محدد، أو جزءًا محددًا ببداية وطول، أو مجالًا محددًا ببداية ونهاية من مصفوفة.
slice!
يقتطع عنصرًا ذي فهرس محدد، أو جزءًا محددًا ببداية وطول، أو مجالًا محددًا ببداية ونهاية من المصفوفة التي استدعيت معه.
sort
يرتب عناصر المصفوفة التي استُدعيت معه ويعيدها في مصفوفة جديدة.
sort!
يرتب عناصر المصفوفة التي استُدعيت معه.
sort_by!
يُرتِّب المصفوفة التي استُدعيت معه وفقًا لمجموعة من المفاتيح (set of keys) المولدة عبر تمرير كل عنصر من عناصر المصفوفة إلى كتلة برمجية مُحددة.
sum
يجمع عناصر المصفوفة التي استُدعيت معه مع بعضها بعضًا.
take
يجلب أول n
عنصر من مصفوفة.
take_while
يجلب العناصر الأولى من مصفوفة التي تحقق شرطًا معينًا؛ أي يستمر التابع في جلب العناصر الأولى ما دامت محققة للشرط ويتوقف عندما لا يحقق أحد العناصر ذلك الشرط المعطى.
to_a
يعيد المصفوفة التي استُدعيت معه.
to_ary
يعيد المصفوفة التي استُدعيت معه.
to_h
يعيد التابع to_h
نتيجة تحويل المصفوفة التي استُدعيت معه إلى مصفوفة مكونة من الأزواج [key, value]
.
to_s
يعدُّ اسمًا بديلًا للتابع inspect
.
transpose
يفترض أنَّ المصفوفة التي استُدعيت معه مكونةٌ من مصفوفات فيعمل على قلب (transposes) الأعمدة إلى أسطر والأسطر إلى أعمدة.
uniq
يحذف العناصر المتكررة من مصفوفة ثم يضع العناصر المتبقية في مصفوفة جديدة.
uniq!
يحذف العناصر المتكررة من مصفوفة.
unshift
يضيف الكائنات المُمرَّرة إليه إلى بداية المصفوفة التي استُدعيت معه مع إزاحة العناصر الأخرى إلى الأمام.
values_at
يجلب عنصرًا واحدًا أو أكثر ذا فهرس محدد من مصفوفة.
zip
يحول الوسائط الممرَّرة إليه إلى مصفوفات ثم يدمج عناصر المصفوفة التي استُدعيت معه مع العناصر المقابلة في الوسائط (المصفوفات) المُمرَّرة.