Перейти к содержанию

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)

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

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