У 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
Зареєструйтеся на Exercism, щоб вивчати й опановувати Ruby, а також 21 концепція121 вправа та справжнє наставництво від людей, і все це безкоштовно.