In Files

  • mrbgems/mruby-range-ext/mrblib/range.rb
  • mrblib/range.rb

Parent

Included Modules

Range

Range

ISO 15.2.14

Range is enumerable

ISO 15.2.14.3

Public Instance Methods

each(&block) click to toggle source

Calls the given block for each element of self and pass the respective element.

ISO 15.2.14.4.4

 
               # File mrblib/range.rb, line 12
def each(&block)
  return to_enum :each unless block

  val = self.first
  last = self.last

  if val.kind_of?(Fixnum) && last.kind_of?(Fixnum) # fixnums are special
    lim = last
    lim += 1 unless exclude_end?
    i = val
    while i < lim
      block.call(i)
      i += 1
    end
    return self
  end

  if val.kind_of?(String) && last.kind_of?(String) # strings are special
    if val.respond_to? :upto
      return val.upto(last, exclude_end?, &block)
    else
      str_each = true
    end
  end

  raise TypeError, "can't iterate" unless val.respond_to? :succ

  return self if (val <=> last) > 0

  while (val <=> last) < 0
    block.call(val)
    val = val.succ
    if str_each
      break if val.size > last.size
    end
  end

  block.call(val) if !exclude_end? && (val <=> last) == 0
  self
end
            
first → obj click to toggle source
first(n) → an_array

Returns the first object in the range, or an array of the first n elements.

(10..20).first     #=> 10
(10..20).first(3)  #=> [10, 11, 12]
 
               # File mrbgems/mruby-range-ext/mrblib/range.rb, line 13
def first(*args)
  return self.begin if args.empty?

  raise ArgumentError, "wrong number of arguments (given #{args.length}, expected 1)" unless args.length == 1
  nv = args[0]
  n = nv.__to_int
  raise ArgumentError, "negative array size (or size too big)" unless 0 <= n
  ary = []
  each do |i|
    break if n <= 0
    ary.push(i)
    n -= 1
  end
  ary
end
            
hash() click to toggle source

redefine hash 15.3.1.3.15

 
               # File mrblib/range.rb, line 54
def hash
  h = first.hash ^ last.hash
  h += 1 if self.exclude_end?
  h
end
            
max(&block) click to toggle source
 
               # File mrbgems/mruby-range-ext/mrblib/range.rb, line 29
def max(&block)
  val = self.first
  last = self.last
  return super if block

  # fast path for numerics
  if val.kind_of?(Numeric) && last.kind_of?(Numeric)
    raise TypeError if exclude_end? && !last.kind_of?(Fixnum)
    return nil if val > last
    return nil if val == last && exclude_end?

    max = last
    max -= 1 if exclude_end?
    return max
  end

  # delegate to Enumerable
  super
end
            
min(&block) click to toggle source
 
               # File mrbgems/mruby-range-ext/mrblib/range.rb, line 49
def min(&block)
  val = self.first
  last = self.last
  return super if block

  # fast path for numerics
  if val.kind_of?(Numeric) && last.kind_of?(Numeric)
    return nil if val > last
    return nil if val == last && exclude_end?

    min = val
    return min
  end

  # delegate to Enumerable
  super
end