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')