در Ruby، آرایهها مجموعههایی مرتب و ایندکسشده با اعداد صحیح از هر نوع شیء هستند.
ایندکسگذاری در آرایه از 0 شروع میشود.
ایندکس منفی نسبت به انتهای آرایه در نظر گرفته میشود؛ برای مثال، ایندکس -1 به آخرین عنصر آرایه اشاره میکند، -2 به عنصر ماقبل آخر و به همین ترتیب.
آرایهها معمولاً با نشانهگذاری [] ساخته میشوند.
میتوانند هر نوع شیء متفاوتی را در خود داشته باشند.
array = [1, "two", 3.0]
میتوان عناصر یک آرایه را با استفاده از متد #[] و بر اساس ایندکسشان بازیابی کرد.
این متد عنصر موجود در آن ایندکس را برمیگرداند، یا زیرآرایهای را برمیگرداند که از ایندکس شروع آغاز میشود و به اندازهی طول مشخصی ادامه مییابد.
ایندکسهای منفی از انتهای آرایه به عقب شمرده میشوند.
a = [ "a", "b", "c", "d", "e" ]
a[2] #=> "c"
a[6] #=> nil
a[1, 3] #=> [ "b", "c", "d" ]
a[-1] #=> "e"
a[-2] #=> "d"
a[-3, 2] #=> ["c", "d"]
متدهای کمکی مفید زیادی روی آرایهها وجود دارد. در ادامه برخی از رایجترین آنها را میبینید:
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
fibonacci.size #=> 8
fibonacci.sum #=> 33
fibonacci.reverse #=> [13, 8, 5, 3, 2, 1, 1, 0]
بهجای اینکه برای پیمایش مجموعهها از حلقهها استفاده کنیم، در Ruby از شمارش بهره میبریم.
شمارش، عملِ گامبرداشتن در یک مجموعه (در این مورد، یک آرایه) و انجام دادن کاری روی هر شیء است. شمارش مفهومی کلیدی در Ruby است و برای کارهایی مانند مرتبسازی، گروهبندی، نگاشت، کاهش و بسیاری موارد دیگر به کار میرود.
یک شمارش برای چاپ هر کلمه در یک آرایه به این صورت خواهد بود:
words = ["the", "cat", "sat"]
words.each do |word|
puts word
end
# Output:
# the
# cat
# sat
در این مثال، متد .each را روی آرایهی خود فراخوانی کردهایم و یک «بلوک» را به آن دادهایم که یک پارامتر (word) میگیرد و آن را چاپ میکند.
بعداً در این مسیر با جزئیات بسیار بیشتری به بلوکها میپردازیم، اما فعلاً آنها را توابع بینامی در نظر بگیرید که میتوانند صفر یا چند آرگومان بگیرند.
میتوان آنها را با نحوهی نگارش do...end (بالا) یا با {} (پایین) تعریف کرد.
در ادامه چند مثال دیگر از متدهای آرایه که از بلوک استفاده میکنند را میبینید:
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
fibonacci.count { |number| number == 1 } #=> 2
fibonacci.any? { |number| number == 6 } #=> false
fibonacci.select { |number| number.odd? } #=> [1, 1, 3, 5, 13]
fibonacci.all? { |number| number < 20 } #=> true
fibonacci.map { |number| number * 2 } #=> [0, 2, 2, 4, 6, 10, 16, 26]
شما پرندهنگری پرشور هستید که پیگیری میکنید در هفت روز گذشته چند پرنده به باغتان آمدهاند.
پنج وظیفه دارید که همهشان به شمار پرندههایی مربوط میشوند که به باغتان آمدهاند.
برای مقایسه، همیشه نسخهای از شمارشهای هفتهی گذشته را کنار دستتان نگه میدارید که عبارتاند از: 0، 2، 5، 3، 7، 8 و 4. متد BirdCount.last_week را پیادهسازی کنید که شمارشهای هفتهی گذشته را برمیگرداند:
BirdCount.last_week
# => [0, 2, 5, 3, 7, 8, 4]
متد BirdCount#yesterday را پیادهسازی کنید تا برگرداند که دیروز چند پرنده به باغتان آمده است. شمارش پرندهها بر اساس روز مرتب شده است؛ اولین عنصر شمارش قدیمیترین روز است و آخرین عنصر شمارش امروز.
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.yesterday
# => 4
متد BirdCount#total را پیادهسازی کنید تا شمار کل پرندههایی را برگرداند که به باغتان آمدهاند:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.total
# => 19
بعضی روزها پرمشغلهتر از بقیهاند. روزی که پنج پرنده یا بیشتر به باغتان آمده باشد، «روز پرمشغله» نامیده میشود.
متد BirdCount#busy_days را پیادهسازی کنید تا تعداد روزهای پرمشغله را برگرداند:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.busy_days
# => 2
متد BirdCount#day_without_birds? را پیادهسازی کنید که اگر روزی بوده است که هیچ پرندهای به باغ نیامده باشد true برمیگرداند؛ در غیر این صورت false را برگردانید:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.day_without_birds?
# => true