Учебники

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

Диапазоны встречаются везде: с января по декабрь, от 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 . Попробуйте следующий пример —

Live Demo

#!/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"]

Диапазоны реализуют методы, которые позволяют вам перебирать их и тестировать их содержимое различными способами —

Live Demo

#!/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 —

Live Demo

#!/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

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

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

Live Demo

#!/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

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