Ruby/Справочник/Range
Класс Range править
Объекты класса Range
представляют собой интервал - множество значений между началом и концом интервала. Интервалы могу быть созданы с использованием литералов s..
e и s...
e, или при помощи метода Range::new
. Интервалы, созданные при помощи ..
, идут с начала по конец включительно. Напротив, интервалы, которые созданы при помощи ...
исключают последнее значение. Когда интервалы используются в итераторах, они возвращают каждое значение из заданного диапазона.
(-1..-5).to_a #-> []
(-5..-1).to_a #-> [-5, -4, -3, -2, -1]
('a'..'e').to_a #-> ["a", "b", "c", "d", "e"]
('a'...'e').to_a #-> ["a", "b", "c", "d"]
Интервалы могут быть созданы с использованием объектов любого типа, при условии, что они сравнимы при помощи оператора <=>
и содержат метод succ
, который возвращает следующий объект последовательности.
class Xs # represent a string of 'x's
include Comparable
attr :length
def initialize(n)
@length = n
end
def succ
Xs.new(@length + 1)
end
def <=>(other)
@length <=> other.length
end
def to_s
sprintf "%2d #{inspect}", @length
end
def inspect
'x' * @length
end
end
r = Xs.new(3)..Xs.new(6) #-> xxx..xxxxxx
r.to_a #-> [xxx, xxxx, xxxxx, xxxxxx]
r.member?(Xs.new(5)) #-> true
В предыдущем примере, класс Xs
подключает примесь Comparable
. Поэтому метод Enumerable#member?
имеет возможность использовать оператор ==
для проверки эквивалентности. Подключенная примесь Comparable
реализует оператор ==
, но для его корректной работы в классе Xs
должен быть реализован оператор <=>
.
Примеси
Enumerable (all?, any?, collect, detect, each_cons, each_slice, each_with_index, entries, enum_cons, enum_slice, enum_with_index, find, find_all, grep, group_by, include?, index_by, inject, map, max, member?, min, partition, reject, select, sort, sort_by, sum, to_a, to_set, zip)
Методы класса
Методы объекта
===, ==, begin, each, end, eql?, exclude_end?, first, hash, include?, inspect, last, member?, step, to_s
Range::new править
Range.new(start, end, exclusive=false) #-> range
Создает интервал, используя start и end. Если третий параметр пропущен или равен false, то range будет включать конечный объект (равный end); иначе он будет исключен.
Range#== править
rng == obj #-> true or false
Возвращает true только если obj является интервалом, начальный и конечный объект которого эквивалентны соответствующим параметрам rng (сравнивается при помощи ==), и результат метода #exclude_end? такой же, как и у rng.
(0..2) == (0..2) #-> true
(0..2) == Range.new(0,2) #-> true
(0..2) == (0...2) #-> false
Range#=== править
rng === obj #-> true или false
rng.member?(val) #-> true или false
rng.include?(val) #-> true или false
Возвращает true если obj является элементом rng, false иначе. Оператор сравнения === используется для сопоставления в конструкции case.
case 79
when 1..50 then print "низко\n"
when 51..75 then print "средне\n"
when 76..100 then print "высоко\n"
end
результат:
высоко
(еще известен как member?, include?)
Range#begin править
rng.first #-> obj
rng.begin #-> obj
Возвращает первый объект из интервала rng.
(еще известен как first)
Range#each править
rng.each {| i | block } #-> rng
Перебирает элементы rng, которые передаются каждую итерацию внутрь блока. Вы можете осуществить перебор только в том случае, если начальный объект поддерживает метод succ (таким образом перебор элементов из интервала, состоящего из объектов Float невозможен).
(10..15).each do |n|
print n, ' '
end
результат:
10 11 12 13 14 15
Range#end править
rng.end #-> obj
rng.last #-> obj
Возвращает элемент, который в rng объявлен как последний.
(1..10).end #-> 10
(1...10).end #-> 10
(еще известен как last)
Range#eql? править
rng.eql?(obj) #-> true или false
Возвращает true только если obj является интервалом, начальный и конечный объект которого эквивалентны соответствующим параметрам rng (сравнивается при помощи #eql?), и результат метода #exclude_end? такой же, как и у rng.
(0..2) == (0..2) #-> true
(0..2) == Range.new(0,2) #-> true
(0..2) == (0...2) #-> false
Range#exclude_end? править
rng.exclude_end? #-> true или false
Возвращает true если rng не включает последний элемент (создан при помощи ...).
Range#first править
rng.first #-> obj
rng.begin #-> obj
Возвращает первый объект из интервала rng.
(еще известен как begin)
Range#hash править
rng.hash #-> fixnum
Возвращает контрольную сумму, которая для двух диапазонов с одинаковыми начальными и конечными объектами, а также с одинаковыми значениями метода #exclude_end? --- будет совпадать.
Range#include? править
rng === obj #-> true или false
rng.member?(val) #-> true или false
rng.include?(val) #-> true или false
Возвращает true если obj является элементом rng, false иначе. Оператор сравнения === используется для сопоставления в конструкции case.
case 79
when 1..50 then print "низко\n"
when 51..75 then print "средне\n"
when 76..100 then print "высоко\n"
end
результат:
высоко
(еще известен как ===, member?)
Range#inspect править
rng.inspect #-> string
Преобразует инретвал rng в печатную форму (использует метод inspect для преобразования начального и конечного объектов).
Range#last править
rng.end #-> obj
rng.last #-> obj
Возвращает элемент, который в rng объявлен как последний.
(1..10).end #-> 10
(1...10).end #-> 10
(еще известен как end)
Range#member? править
rng === obj #-> true или false
rng.member?(val) #-> true или false
rng.include?(val) #-> true или false
Возвращает true если obj является элементом rng, false иначе. Оператор сравнения === используется для сопоставления в конструкции case.
case 79
when 1..50 then print "низко\n"
when 51..75 then print "средне\n"
when 76..100 then print "высоко\n"
end
результат:
высоко
(еще известен как ===, include?)
Range#step править
rng.step(n=1) {| obj | block } #-> rng
Перебирает элементы из диапазона rng, передавая каждый n-ый элемент в блок. Если диапазон состоит из целых чисел или строк, то элементы вычисляются целочисленным делением. Иначе step использует метод succ для перебора элментов. Следующий код использует класс Xs, который использовался нами ранее (см. Range).
range = Xs.new(1)..Xs.new(10)
range.step(2) {|x| puts x}
range.step(3) {|x| puts x}
результат:
1 x 3 xxx 5 xxxxx 7 xxxxxxx 9 xxxxxxxxx 1 x 4 xxxx 7 xxxxxxx 10 xxxxxxxxxx
Range#to_s править
rng.to_s #-> string
Преобразует интервал rng в печатную форму.