struct Range(B, E)
Overview
A Range represents an interval: a set of values with a beginning and an end.
Ranges may be constructed using the usual .new method or with literals:
x..y  # an inclusive range, in mathematics: [x, y]
x...y # an exclusive range, in mathematics: [x, y)
(x..) # an endless range, in mathematics: >= x
..y   # a beginless inclusive range, in mathematics: <= y
...y  # a beginless exclusive range, in mathematics: < yAn easy way to remember which one is inclusive and which one is exclusive it to think of the extra dot as if it pushes y further away, thus leaving it outside of the range.
Ranges typically involve integers, but can be created using arbitrary objects
as long as they define succ (or pred for #reverse_each), to get the
next element in the range, and < and ==, to know when the range reached the end:
# Represents a string of 'x's.
struct Xs
  include Comparable(Xs)
  getter size
  def initialize(@size : Int32)
  end
  def succ
    Xs.new(@size + 1)
  end
  def <=>(other)
    @size <=> other.size
  end
  def inspect(io)
    @size.times { io << 'x' }
  end
  def to_s(io)
    io << @size << ' '
    inspect(io)
  end
endAn example of using Xs to construct a range:
r = Xs.new(3)..Xs.new(6)
r.to_s                 # => "xxx..xxxxxx"
r.to_a                 # => [Xs.new(3), Xs.new(4), Xs.new(5), Xs.new(6)]
r.includes?(Xs.new(5)) # => trueIncluded Modules
Defined in:
range.crrange/bsearch.cr
Constructors
- 
        .new(begin __arg0 : B, end __arg1 : E, exclusive : Bool = false)
        
          Constructs a Rangeusing the given beginning and end.
Instance Method Summary
- 
        #===(value)
        
          Same as #includes?, useful for thecaseexpression.
- 
        #begin : B
        
          Returns the object that defines the beginning of this range. 
- 
        #bsearch(&block : B | E -> Bool)
        
          By using binary search, returns the first value for which the passed block returns true.
- #clone
- 
        #covers?(value)
        
          Same as #includes?.
- 
        #cycle
        
          Returns an Iteratorthat cycles over the values of this range.
- 
        #each(&) : Nil
        
          Iterates over the elements of this range, passing each in turn to the block. 
- 
        #each
        
          Returns an Iteratorover the elements of this range.
- 
        #end : E
        
          Returns the object that defines the end of the range. 
- 
        #excludes_end?
        
          Returns trueif this range excludes the end element.
- 
        #exclusive? : Bool
        
          Returns trueif the range is exclusive.
- 
        #includes?(value)
        
          Returns trueif this range includes the given value.
- 
        #reverse_each(&) : Nil
        
          Iterates over the elements of this range in reverse order, passing each in turn to the block. 
- 
        #reverse_each
        
          Returns a reverse Iteratorover the elements of this range.
- 
        #step(by = 1)
        
          Returns an Iteratorthat returns each nth element in this range.
- 
        #step(by = 1, &)
        
          Iterates over this range, passing each nth element to the block. 
- 
        #sum(initial)
        
          If selfis aIntrange, it provides O(1) implementation, otherwise it is same asEnumerable#sum.
Instance methods inherited from module Iterable(B)
  
  
    
      chunk(reuse = false, &block : T -> U) forall U
    chunk, 
    
  
    
      chunk_while(reuse : Bool | Array(T) = false, &block : T, T -> B) forall B
    chunk_while, 
    
  
    
      cycle(n)cycle cycle, each each, each_cons(count : Int, reuse = false) each_cons, each_slice(count : Int, reuse = false) each_slice, each_with_index(offset = 0) each_with_index, each_with_object(obj) each_with_object, slice_after(reuse : Bool | Array(T) = false, &block : T -> B) forall B
slice_after(pattern, reuse : Bool | Array(T) = false) slice_after, slice_before(reuse : Bool | Array(T) = false, &block : T -> B) forall B
slice_before(pattern, reuse : Bool | Array(T) = false) slice_before, slice_when(reuse : Bool | Array(T) = false, &block : T, T -> B) forall B slice_when
Instance methods inherited from module Enumerable(B)
  
  
    
      all?(&)all?(pattern)
all? all?, any?(&)
any?(pattern)
any? any?, chunks(&block : T -> U) forall U chunks, compact_map(&) compact_map, count(&)
count(item) count, cycle(n, &)
cycle(&) cycle, each(&block : T -> _) each, each_cons(count : Int, reuse = false, &) each_cons, each_cons_pair(& : T, T -> _) : Nil each_cons_pair, each_slice(count : Int, reuse = false, &) each_slice, each_with_index(offset = 0, &) each_with_index, each_with_object(obj, &) each_with_object, find(if_none = nil, &) find, first(count : Int)
first first, first? first?, flat_map(&block : T -> Array(U) | Iterator(U) | U) forall U flat_map, grep(pattern) grep, group_by(&block : T -> U) forall U group_by, in_groups_of(size : Int, filled_up_with : U = nil) forall U
in_groups_of(size : Int, filled_up_with : U = nil, reuse = false, &) forall U in_groups_of, includes?(obj) includes?, index(&)
index(obj) index, index_by(&block : T -> U) forall U index_by, join(separator = "", &)
join(separator, io, &)
join(separator, io)
join(separator = "") join, map(&block : T -> U) forall U map, map_with_index(offset = 0, &block : T, Int32 -> U) forall U map_with_index, max max, max? max?, max_by(&block : T -> U) forall U max_by, max_by?(&block : T -> U) forall U max_by?, max_of(&block : T -> U) forall U max_of, max_of?(&block : T -> U) forall U max_of?, min min, min? min?, min_by(&block : T -> U) forall U min_by, min_by?(&block : T -> U) forall U min_by?, min_of(&block : T -> U) forall U min_of, min_of?(&block : T -> U) forall U min_of?, minmax minmax, minmax? minmax?, minmax_by(&block : T -> U) forall U minmax_by, minmax_by?(&block : T -> U) forall U minmax_by?, minmax_of(&block : T -> U) forall U minmax_of, minmax_of?(&block : T -> U) forall U minmax_of?, none?
none?(pattern)
none?(&) none?, one?(&)
one?(pattern)
one? one?, partition(&) partition, product(&)
product(initial : Number, &)
product
product(initial : Number) product, reduce(memo, &)
reduce(&) reduce, reduce?(&) reduce?, reject(&block : T -> )
reject(type : U.class) forall U
reject(pattern) reject, select(pattern)
select(type : U.class) forall U
select(&block : T -> ) select, size size, skip(count : Int) skip, skip_while(&) skip_while, sum(initial)
sum
sum(initial, &)
sum(&) sum, take_while(&) take_while, tally : Hash(T, Int32) tally, to_a to_a, to_h
to_h(&block : T -> Tuple(K, V)) forall K, V to_h, to_set to_set, zip(*others : Indexable | Iterable | Iterator, &)
zip(*others : Indexable | Iterable | Iterator) zip, zip?(*others : Indexable | Iterable | Iterator, &)
zip?(*others : Indexable | Iterable | Iterator) zip?
Instance methods inherited from struct Struct
  
  
    
      ==(other) : Bool
    ==, 
    
  
    
      hash(hasher)
    hash, 
    
  
    
      inspect(io : IO) : Nil
    inspect, 
    
  
    
      pretty_print(pp) : Nil
    pretty_print, 
    
  
    
      to_s(io : IO) : Nil
    to_s
    
  
    
    
  
    
  Instance methods inherited from struct Value
  
  
    
      ==(other : JSON::Any)==(other : YAML::Any)
==(other) ==, dup dup
Instance methods inherited from class Object
  
  
    
      ! : Bool
    !, 
    
  
    
      !=(other)
    !=, 
    
  
    
      !~(other)
    !~, 
    
  
    
      ==(other)
    ==, 
    
  
    
      ===(other : JSON::Any)===(other : YAML::Any)
===(other) ===, =~(other) =~, as(type : Class) as, as?(type : Class) as?, class class, dup dup, hash
hash(hasher) hash, inspect(io : IO) : Nil
inspect : String inspect, is_a?(type : Class) : Bool is_a?, itself itself, nil? : Bool nil?, not_nil! not_nil!, pretty_inspect(width = 79, newline = "\n", indent = 0) : String pretty_inspect, pretty_print(pp : PrettyPrint) : Nil pretty_print, responds_to?(name : Symbol) : Bool responds_to?, tap(&) tap, to_json(io : IO)
to_json to_json, to_pretty_json(indent : String = " ")
to_pretty_json(io : IO, indent : String = " ") to_pretty_json, to_s : String
to_s(io : IO) : Nil to_s, to_yaml(io : IO)
to_yaml to_yaml, try(&) try, unsafe_as(type : T.class) forall T unsafe_as
Class methods inherited from class Object
  
  
    
      from_json(string_or_io, root : String)from_json(string_or_io) from_json, from_yaml(string_or_io : String | IO) from_yaml
Constructor Detail
Constructs a Range using the given beginning and end.
Range.new(1, 10)                  # => 1..10
Range.new(1, 10, exclusive: true) # => 1...10Instance Method Detail
Same as #includes?, useful for the case expression.
case 79
when 1..50   then puts "low"
when 51..75  then puts "medium"
when 76..100 then puts "high"
endProduces:
highSee also: Object#===.
Returns the object that defines the beginning of this range.
(1..10).begin  # => 1
(1...10).begin # => 1By using binary search, returns the first value
for which the passed block returns true.
If the block returns false, the finding value exists
behind. If the block returns true, the finding value
is itself or exists infront.
(0..10).bsearch { |x| x >= 5 }                       # => 5
(0..Float64::INFINITY).bsearch { |x| x ** 4 >= 256 } # => 4Returns nil if the block didn't return true for any value.
Returns an Iterator that cycles over the values of this range.
(1..3).cycle.first(5).to_a # => [1, 2, 3, 1, 2]Iterates over the elements of this range, passing each in turn to the block.
(10..15).each { |n| print n, ' ' }
# prints: 10 11 12 13 14 15Returns an Iterator over the elements of this range.
(1..3).each.skip(1).to_a # => [2, 3]Returns the object that defines the end of the range.
(1..10).end  # => 10
(1...10).end # => 10Returns true if this range excludes the end element.
(1..10).excludes_end?  # => false
(1...10).excludes_end? # => trueReturns true if the range is exclusive.
Returns false otherwise (default).
Returns true if this range includes the given value.
(1..10).includes?(4)  # => true
(1..10).includes?(10) # => true
(1..10).includes?(11) # => false
(1...10).includes?(9)  # => true
(1...10).includes?(10) # => falseIterates over the elements of this range in reverse order, passing each in turn to the block.
(10...15).reverse_each { |n| print n, ' ' }
# prints: 14 13 12 11 10Returns a reverse Iterator over the elements of this range.
(1..3).reverse_each.skip(1).to_a # => [2, 1]Returns an Iterator that returns each nth element in this range.
(1..10).step(3).skip(1).to_a # => [4, 7, 10]Iterates over this range, passing each nth element to the block.
range = Xs.new(1)..Xs.new(10)
range.step(2) { |x| puts x }
puts
range.step(3) { |x| puts x }Produces:
1 x
3 xxx
5 xxxxx
7 xxxxxxx
9 xxxxxxxxx
1 x
4 xxxx
7 xxxxxxx
10 xxxxxxxxxxSee Range's overview for the definition of Xs.
If self is a Int range, it provides O(1) implementation,
otherwise it is same as Enumerable#sum.