Диапазон (Range) в Ruby — это объект, представляющий интервал между начальным и конечным значениями. Диапазоны могут быть включительными (..
) или исключающими (...
).
inclusive_range = 1..10 # Включает 10
exclusive_range = 1...10 # Исключает 10
range_from_vars = start..end
letter_range = 'a'..'z'
time_range = Time.new(2023, 1, 1)..Time.new(2023, 12, 31)
(1..10).include?(5) # => true
(1..10).include?(10.5) # => false
('a'..'z').cover?('m') # => true
age = 25
case age
when 0..17 then "Ребенок"
when 18..64 then "Взрослый"
else "Пенсионер"
end
# => "Взрослый"
(1..5).each { |n| puts n }
# Выводит: 1 2 3 4 5
(1..5).to_a # => [1, 2, 3, 4, 5]
('a'..'e').to_a # => ["a", "b", "c", "d", "e"]
range = 1..10
range.begin # => 1
range.end # => 10
range.first # => 1
range.last # => 10
(1..10).exclude_end? # => false
(1...10).exclude_end? # => true
(1..10).size # => 10
(1...10).size # => 9
('a'..'z').size # => nil (для некоторых типов размер неизвестен)
valid_age = 18..99
valid_age.cover?(user_age) # Проверка возраста
('aa'..'zz').take(5) # => ["aa", "ab", "ac", "ad", "ae"]
text = "Hello, Ruby!"
text[7..10] # => "Ruby"
(1.5..5.5).step(0.5).to_a # => [1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5]
('A'..'Z').cover?('M') # => true
require 'date'
(Date.new(2023, 1, 1)..Date.new(2023, 1, 31)).each { |date| puts date }
Для работы с пользовательскими классами необходимо:
<=>
для сравненияsucc
для получения следующего элементаclass MyNumber
attr_reader :value
def initialize(value)
@value = value
end
def <=>(other)
value <=> other.value
end
def succ
MyNumber.new(value + 1)
end
end
range = MyNumber.new(1)..MyNumber.new(5)
range.to_a # => Массив объектов MyNumber
(1..10).step(2).to_a # => [1, 3, 5, 7, 9]
cover?
вместо include?
для проверки принадлежности, если не нужна итерация...
когда конечное значение не должно включатьсяPER_PAGE = 10
current_page = 3
start = (current_page - 1) * PER_PAGE + 1
finish = current_page * PER_PAGE
records = Record.where(id: start..finish)
def generate_ids(start_id, count)
(start_id..).take(count) # Бесконечный диапазон в Ruby 2.6+
end
Резюмируем: диапазоны в Ruby — это мощный инструмент для работы с последовательностями и интервалами значений. Они предоставляют удобный синтаксис для проверки принадлежности, итерации и генерации последовательностей. Понимание работы диапазонов позволяет писать более выразительный и эффективный код, особенно при работе с интервалами значений, строками и пользовательскими объектами.