Діапазони задають інтервал між двома значеннями.
Найчастіше діапазони підтримують такі типи, як Integer і String.
Їх можна використовувати для багатьох речей: швидкого створення колекції, нарізання рядків тексту (англ. string), перевірки, чи входить значення в діапазон, та ітерації.
Їх створюють за допомогою оператора діапазону .. або ... (включно та не включно відповідно).
1..5 # => 1..5
1...5 # => 1...5
(1..5).to_a # => [1, 2, 3, 4, 5]
(1...5).to_a # => [1, 2, 3, 4]
Причина існування двох операторів діапазону в тому, щоб можна було створювати діапазони з кінцевим значенням включно або без нього. Це буває корисно, наприклад, коли ми працюємо з індексами, що починаються з нуля.
Діапазони також можна створювати за допомогою конструктора Range.
Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
Коли ми створюємо діапазон у Ruby за допомогою операторів діапазону .. або ... і хочемо викликати метод у цього діапазону, потрібно взяти діапазон у дужки.
Інакше Ruby викличе метод у другого аргументу оператора діапазону.
(1..5).sum # => 15
1..5.sum # => Error: undefined method `sum' for 5:Integer (NoMethodError)
Коли потрібно взяти частину рядка тексту, можна скористатися оператором діапазону, щоб отримати підрядок. Тобто створити діапазон із початковим і кінцевим індексом підрядка.
"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"
Також можна використовувати відʼємні індекси, щоб отримати підрядок із кінця рядка тексту.
"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"
У діапазонів є набір методів, які можна використовувати для роботи з ними. Наприклад, за допомогою цих методів можна знайти суму всіх значень у діапазоні або перевірити, чи містить діапазон певне значення.
| Метод | Опис | Приклад |
|---|---|---|
sum |
Повертає суму всіх значень у діапазоні | (1..5).sum # => 15 |
size |
Повертає розмір діапазону | (1..5).size # => 5 |
include? |
Повертає true, якщо діапазон містить задане значення, інакше false
|
(1..5).include?(3) # => true |
Діапазон може бути нескінченним або безпочатковим.
У нескінченного чи безпочаткового діапазону початкове або кінцеве значення дорівнює nil, але під час задання діапазону nil можна опустити.
Безпочаткові та нескінченні діапазони стають у пригоді, коли потрібно, наприклад, узяти частину рядка тексту від початку або до кінця.
"Hello World"[0..] # => "Hello World"
"Hello World"[4..] # => "o World"
"Hello World"[..5] # => "Hello "
Якщо застосувати нескінченний діапазон не до колекції, він може утворити нескінченну послідовність, тож будьмо з ним обережні.
Рядки тексту теж можна використовувати в діапазонах, і це дає змогу отримати інтервал рядків тексту між двома рядками. Поведінка такого діапазону може бути трохи несподіваною для деяких рядків, тож будьмо з ним обережні.
"aa".."az".to_a # => ["aa", "ab", "ac", ..., "az"]
Ruby дозволяє використовувати у діапазонах власні обʼєкти. Для цього обʼєкт має реалізовувати таке:
Comparable
succ
<=>
Завдяки цим методам діапазон може перебирати обʼєкт і порівнювати обʼєкти в діапазоні.
class Foo
include Comparable
attr_reader :value
def initialize(value)
@value = value
end
def succ
Foo.new(value + 1)
end
def <=>(other)
value <=> other.value
end
end
(Foo.new(1)..Foo.new(5))
# => #<Foo:0x7f3552bebe70 @value=1>, #<Foo:0x7f3552bebe50 @value=2>, #<Foo:0x7f3552bebe40 @value=3>, #<Foo:0x7f3552bebe30 @value=4>, #<Foo:0x7f3552bebe20 @value=5>