Треки
/
Ruby
Ruby
/
Салабус
/
Діапазони
Ді

Діапазони у Ruby

1 вправа

Про концепцію Діапазони

Діапазони задають інтервал між двома значеннями. Найчастіше діапазони підтримують такі типи, як 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
Note

Коли ми створюємо діапазон у 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 "
Caution

Якщо застосувати нескінченний діапазон не до колекції, він може утворити нескінченну послідовність, тож будьмо з ним обережні.

Діапазони рядків тексту

Рядки тексту теж можна використовувати в діапазонах, і це дає змогу отримати інтервал рядків тексту між двома рядками. Поведінка такого діапазону може бути трохи несподіваною для деяких рядків, тож будьмо з ним обережні.

"aa".."az".to_a # => ["aa", "ab", "ac", ..., "az"]

Власні обʼєкти в діапазонах

Advanced

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>
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Діапазони