Рубин - Диапазоны

Диапазоны встречаются везде: с января по декабрь, от 0 до 9, строки с 50 по 67 и так далее. Ruby поддерживает диапазоны и позволяет нам использовать диапазоны по-разному -

  • Диапазоны как последовательности
  • Диапазоны как условия
  • Диапазоны как интервалы

Диапазоны как последовательности

Первое и, возможно, наиболее естественное использование диапазонов - это выражение последовательности. Последовательности имеют начальную точку, конечную точку и способ получения последовательных значений в последовательности.

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

$, =", "   # Array value separator
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

# Assume a range
digits = 0..9

puts digits.include?(5)
ret = digits.min
puts "Min value is #{ret}"

ret = digits.max
puts "Max value is #{ret}"

ret = digits.reject {|i| i < 5 }
puts "Rejected values are #{ret}"

digits.each do |digit|
   puts "In Loop #{digit}"
end

Это даст следующий результат -

true
Min value is 0
Max value is 9
Rejected values are 5, 6, 7, 8, 9
In Loop 0
In Loop 1
In Loop 2
In Loop 3
In Loop 4
In Loop 5
In Loop 6
In Loop 7
In Loop 8
In Loop 9

Диапазоны как условия

Диапазоны также могут использоваться как условные выражения. Например, следующий фрагмент коды печатает наборы строк из стандартного ввода, где первая строка в каждом наборе содержит слово начала и последнюю строку слова концов -

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 "Pass with Merit"
   when 71..100 then "Pass with Distinction"
   else "Invalid Score"
end

puts result

Это даст следующий результат -

Pass with Merit

Диапазоны как интервалы

Последнее использование универсального диапазона - это интервальный тест: определение того, попадает ли какое-либо значение в интервал, представленный диапазоном. Это делается с помощью ===, оператора равенства регистра.

#!/usr/bin/ruby

if ((1..10) === 5)
   puts "5 lies in (1..10)"
end

if (('a'..'j') === 'c')
   puts "c lies in ('a'..'j')"
end

if (('a'..'j') === 'z')
   puts "z lies in ('a'..'j')"
end

Это даст следующий результат -

5 lies in (1..10)
c lies in ('a'..'j')