Ruby - zakresy

Zakresy występują wszędzie: od stycznia do grudnia, od 0 do 9, wiersze od 50 do 67 itd. Ruby obsługuje zakresy i pozwala nam używać zakresów na różne sposoby -

  • Zakresy jako sekwencje
  • Zakresy jako warunki
  • Zakresy jako interwały

Zakresy jako sekwencje

Pierwszym i prawdopodobnie najbardziej naturalnym zastosowaniem zakresów jest wyrażenie sekwencji. Sekwencje mają punkt początkowy, punkt końcowy i sposób tworzenia kolejnych wartości w sekwencji.

Ruby tworzy te sekwencje przy użyciu ''..'' i ''...''operatory zakresu. Forma z dwiema kropkami tworzy zakres obejmujący, a forma z trzema kropkami tworzy zakres, który wyklucza określoną wysoką wartość.

(1..5)        #==> 1, 2, 3, 4, 5
(1...5)       #==> 1, 2, 3, 4
('a'..'d')    #==> 'a', 'b', 'c', 'd'

Sekwencja 1..100 jest utrzymywana jako obiekt Range zawierający odniesienia do dwóch obiektów Fixnum . Jeśli potrzebujesz, możesz przekonwertować zakres na listę przy użyciu metody to_a . Wypróbuj następujący przykład -

#!/usr/bin/ruby

$, =", "   # Array value separator
range1 = (1..10).to_a
range2 = ('bar'..'bat').to_a

puts "#{range1}"
puts "#{range2}"

To da następujący wynik -

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
["bar", "bas", "bat"]

Zakresy implementują metody, które pozwalają na ich iterację i testowanie ich zawartości na różne sposoby -

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

To da następujący wynik -

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

Zakresy jako warunki

Zakresy mogą być również używane jako wyrażenia warunkowe. Na przykład poniższy fragment kodu wypisuje zestawy wierszy ze standardowego wejścia, gdzie pierwsza linia każdego zestawu zawiera słowo początek, a ostatnia linia kończy się -

while gets
   print if /start/../end/
end

Zakresy mogą być używane w przypadku instrukcji -

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

To da następujący wynik -

Pass with Merit

Zakresy jako interwały

Ostatnim zastosowaniem uniwersalnego zakresu jest test interwałowy: sprawdzenie, czy jakaś wartość mieści się w przedziale reprezentowanym przez zakres. Odbywa się to za pomocą ===, operatora równości wielkości liter.

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

To da następujący wynik -

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