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 в печатную форму.