الفرق بين المراجعتين ل"Ruby/Array"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (مراجعة وتدقيق.)
سطر 187: سطر 187:
 
arr                      #=> [1, 2, 3]
 
arr                      #=> [1, 2, 3]
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
 +
===<code>[[العنوان في الموسوعة|اسم الدالة]]</code>===
 +
 +
===<code>[[Ruby/Array|https://wiki.hsoub.com/Ruby/Array]]</code>===
 +
 +
===<code>[[Ruby/Array/new|new]]</code>===
 +
 +
===<code>[[Ruby/Array/assign_operator|assign_operator]]</code>===
 +
 +
===<code>[[Ruby/Array/Array|Array]]</code>===
 +
 +
===<code>[[Ruby/Array/minus|-]]</code>===
 +
 +
===<code>[[Ruby/Array/try_convert|try_convert]]</code>===
 +
 +
===<code>[[Ruby/Array/and|and]]</code>===
 +
 +
===<code>[[Ruby/Array/star|star]]</code>===
 +
 +
===<code>[[Ruby/Array/plus|plus]]</code>===
 +
 +
===<code>[[Ruby/Array/append_operator|append_operator]]</code>===
 +
 +
===<code>[[Ruby/Array/Comparison|Comparison]]</code>===
 +
 +
===<code>[[Ruby/Array/equal|equal]]</code>===
 +
 +
===<code>[[Ruby/Array/any|any]]</code>===
 +
 +
===<code>[[Ruby/Array/append_operator|append_operator]]</code>===
 +
 +
===<code>[[Ruby/Array/assoc|assoc]]</code>===
 +
 +
===<code>[[Ruby/Array/at|at]]</code>===
 +
 +
===<code>[[Ruby/Array/bsearch|bsearch]]</code>===
 +
 +
===<code>[[Ruby/Array/bsearch_index|bsearch_index]]</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>[[Ruby/Array/compact|compact]]</code>===
 +
 +
===<code>[[Ruby/Array/compact!|compact!‎]]</code>===
 +
 +
===<code>[[Ruby/Array/concat|concat]]</code>===
 +
 +
===<code>[[Ruby/Array/count|count]]</code>===
 +
 +
===<code>[[Ruby/Array/cycle|cycle]]</code>===
 +
 +
===<code>[[Ruby/Array/delete|delete]]</code>===
 +
 +
===<code>[[Ruby/Array/delete_at|delete_at]]</code>===
 +
 +
===<code>[[Ruby/Array/delete_if|delete_if]]</code>===
 +
 +
===<code>[[Ruby/Array/dig|dig]]</code>===
 +
 +
===<code>[[Ruby/Array/drop|drop]]</code>===
 +
 +
===<code>[[Ruby/Array/drop_while|drop_while]]</code>===
 +
 +
===<code>[[Ruby/Array/each|each]]</code>===
 +
 +
===<code>[[Ruby/Array/eql|eql]]</code>===
 +
 +
===<code>[[Ruby/Array/each_index|each_index]]</code>===
 +
 +
===<code>[[Ruby/Array/empty?‎|empty?‎‎]]</code>===
 +
 +
===<code>[[Ruby/Array/fetch|fetch]]</code>===
 +
 +
===<code>[[Ruby/Array/fill|fill]]</code>===
 +
 +
===<code>[[Ruby/Array/find_index|find_index]]</code>===
 +
 +
===<code>[[Ruby/Array/first|first]]</code>===
 +
 +
===<code>[[Ruby/Array/flatten|flatten]]</code>===
 +
 +
===<code>[[Ruby/Array/flatten!‎|flatten!‎]]</code>===
 +
 +
===<code>[[Ruby/Array/frozen?‎|frozen?‎‎]]</code>===
 +
 +
===<code>[[Ruby/Array/hash|hash]]</code>===
 +
 +
===<code>[[Ruby/Array/include?‎|include?‎‎]]</code>===
 +
 +
===<code>[[Ruby/Array/index_operator|index_operator]]</code>===
 +
 +
===<code>[[Ruby/Array/index|index]]</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>[[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>===
 +
 +
===<code>[[Ruby/Array/permutation|permutation]]</code>===
 +
 +
===<code>[[Ruby/Array/pop|pop]]</code>===
 +
 +
===<code>[[Ruby/Array/prepend|prepend]]</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>===
 +
 +
===<code>[[Ruby/Array/repeated_permutation|repeated_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>===
 +
 +
===<code>[[Ruby/Array/rindex|rindex]]</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>[[Ruby/Array/shuffle|shuffle]]</code>===
 +
 +
===<code>[[Ruby/Array/shuffle!‎|shuffle!‎]]</code>===
 +
 +
===<code>[[Ruby/Array/size|size]]</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>===
 +
 +
===<code>[[Ruby/Array/sum|sum]]</code>===
 +
 +
===<code>[[Ruby/Array/take|take]]</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>[[Ruby/Array/to_s|to_s]]</code>===
 +
 +
===<code>[[Ruby/Array/transpose|transpose]]</code>===
 +
 +
===<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>===
 +
 +
===<code>[[Ruby/Array/union||]]</code>===
 +
 +
 
==مصادر==
 
==مصادر==
 
* [https://ruby-doc.org/core-2.5.1/Array.html صفحة الصنف Array في توثيق روبي الرسمي.]
 
* [https://ruby-doc.org/core-2.5.1/Array.html صفحة الصنف Array في توثيق روبي الرسمي.]

مراجعة 12:25، 18 نوفمبر 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]


اسم الدالة

https://wiki.hsoub.com/Ruby/Array

new

assign_operator

Array

-

try_convert

and

star

plus

append_operator

Comparison

equal

any

append_operator

assoc

at

bsearch

bsearch_index

clear

collect

!collect

combination

compact

compact!‎

concat

count

cycle

delete

delete_at

delete_if

dig

drop

drop_while

each

eql

each_index

empty?‎‎

fetch

fill

find_index

first

flatten

flatten!‎

frozen?‎‎

hash

include?‎‎

index_operator

index

initialize_copy

insert

inspect

join

keep_if

last

length

map

!map

max

min

pack

permutation

pop

prepend

product

push

rassoc

reject

reject!‎

repeated_combination

repeated_permutation

replace

reverse

reverse!‎

reverse_each

rindex

rotate

rotate!‎

sample

select

select!‎

shift

shuffle

shuffle!‎

size

slice

slice!‎

sort

sort!‎

sort_by!‎

sum

take

take_while

to_a

to_ary

to_h

to_s

transpose

uniq

uniq!‎

unshift

values_at

zip

|

مصادر