Класс 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)

Методы класса

new

Методы объекта

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