Ruby Ranges
Диапазоны встречаются везде, пример: с января по декабрь, от 0 до 9, строки с 50 по 67 и так далее.
Ruby поддерживает диапазоны и позволяет нам использовать диапазоны различными способами:
Диапазоны как последовательности
Диапазоны как условия
Диапазоны как интервалы
Ranges as Sequences (Диапазоны как последовательности):
Первое и, возможно, наиболее естественное использование диапазонов - это выражение последовательности. Последовательности имеют начальную точку, конечную точку и способ получения последовательных значений в последовательности.
Ruby создает эти последовательности, используя операторы диапазона «..» и «...». Форма с двумя точками создает включающий диапазон, а форма с тремя точками создает диапазон, исключающий указанное максимальное значение.
( 1..5 ) # ==> 1, 2, 3, 4, 5
( 1 ... 5 ) # ==> 1, 2, 3, 4
( 'a' .. 'd' ) # == > 'a', 'b', 'c', 'd'
Последовательность 1..100 хранится как объект Range, содержащий ссылки на два объекта Fixnum. При необходимости вы можете преобразовать диапазон в список с помощью метода to_a. Попробуйте следующий пример:
#!/usr/bin/ruby
$, = "," # Разделитель значений массива
range1 = (1..10) .to_a
range2 = ('bar' .. 'bat'). to_a
puts "#{range1}"
puts "#{range2}"
Это даст следующий результат:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
bar, bas, bat
Диапазоны реализуют методы, которые позволяют вам перебирать их и тестировать их содержимое различными способами:
#!/usr/bin/ruby
# Предположим, что диапазон
digits = 0..9
puts digits.include?(5)
ret = digits.min
puts "Мин. значение #{ret}"
ret = digits.max
puts "Максимальное значение равно #{ret} "
ret = digits.reject {|i| i < 5}
puts "Отклоненные значения #{ret}"
digits.each do |digit|
puts "В цикл #{digit}"
end
Это даст следующий результат:
true
,Мин. значение 0
,Максимальное значение равно 9
,Отклоненные значения 5,6,7,8,9
,В цикл 0
,В цикл 1
,В цикл 2
,В цикл 3
,В цикл 4
,В цикл 5
,В цикл 6
,В цикл 7
,В цикл 8
,В цикл 9
Ranges as Condition (Диапазоны как условия):
Диапазоны также могут использоваться как условные выражения. Например, следующий фрагмент кода печатает наборы строк из стандартного ввода, где первая строка в каждом наборе содержит начало слова, а последняя строка - конец слова:
while gets
print if /start/../end/
end
Диапазоны могут использоваться в операторах case:
#!/usr/bin/ruby
score = 70
result = case score
when 0..40 then "Fail"
when 41..60 then "Pass"
when 61..70 then "Пройдено с отличием"
when 71..100 then "Pass with Distinction"
else "Invalid Score"
end
puts result
Это даст следующий результат:
Пройдено с отличием
Ranges as Intervals (Диапазоны как интервалы):
Последнее использование универсального диапазона - это интервальный тест: определение того, попадает ли какое-либо значение в интервал, представленный диапазоном. Это делается с помощью ===, оператора равенства регистра.
#!/usr/bin/ruby
if ( (1..10) === 5)
puts "5 находится в (1..10)"
end
if ( ('a' .. 'j') === 'c')
puts "c лежит в ('a'..'j')"
end
if (('a'..'j') === 'z')
puts "z лежит в ('a'.. 'j') "
end
Это даст следующий результат:
5 находится в (1..10)
,c лежит в ('a'..'j')