Class: Range

Inherits:
Object show all
Includes:
Enumerable
Defined in:
ext/enterprise_script_service/mruby/mrblib/range.rb,
ext/enterprise_script_service/mruby/mrblib/range.rb,
ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb

Overview

Range is enumerable

ISO 15.2.14.3

Constant Summary

Constants included from Enumerable

Enumerable::NONE

Instance Method Summary collapse

Methods included from Enumerable

#all?, #any?, #chain, #collect, #count, #cycle, #detect, #drop, #drop_while, #each_cons, #each_slice, #each_with_index, #each_with_object, #entries, #filter_map, #find_all, #find_index, #flat_map, #grep, #group_by, #include?, #inject, #lazy, #max_by, #min_by, #minmax, #minmax_by, #none?, #one?, #partition, #reject, #reverse_each, #sort, #sort_by, #take, #take_while, #tally, #to_h, #uniq, #zip

Instance Method Details

#each(&block) ⇒ Object

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

ISO 15.2.14.4.4

Raises:



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'ext/enterprise_script_service/mruby/mrblib/range.rb', line 12

def each(&block)
  return to_enum :each unless block

  val = self.begin
  last = self.end

  if val.kind_of?(Fixnum) && last.nil?
    i = val
    while true
      block.call(i)
      i += 1
    end
    return self
  end

  if val.kind_of?(String) && last.nil?
    if val.respond_to? :__upto_endless
      return val.__upto_endless(&block)
    else
      str_each = true
    end
  end

  if val.kind_of?(Integer) && last.kind_of?(Integer) # 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(*args) ⇒ Object

call-seq:

rng.first    -> obj
rng.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]

Raises:



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb', line 13

def first(*args)
  raise RangeError, "cannot get the first element of beginless range" if self.begin.nil?
  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

#hashObject

redefine #hash 15.3.1.3.15



71
72
73
74
75
# File 'ext/enterprise_script_service/mruby/mrblib/range.rb', line 71

def hash
  h = first.hash ^ last.hash
  h += 1 if self.exclude_end?
  h
end

#last(*args) ⇒ Object

call-seq:

rng.last    -> obj
rng.last(n) -> an_array

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

Note that with no arguments last will return the object that defines the end of the range even if #exclude_end? is true.

(10..20).last      #=> 20
(10...20).last     #=> 20
(10..20).last(3)   #=> [18, 19, 20]
(10...20).last(3)  #=> [17, 18, 19]

Raises:



45
46
47
48
49
50
51
52
53
54
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb', line 45

def last(*args)
  raise RangeError, "cannot get the last element of endless range" if self.end.nil?
  return self.end 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
  return self.to_a.last(nv)
end

#max(&block) ⇒ Object

Raises:



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb', line 56

def max(&block)
  val = self.begin
  last = self.end
  return super if block

  raise RangeError, "cannot get the maximum of endless range" if last.nil?

  # fast path for numerics
  if val.kind_of?(Numeric) && last.kind_of?(Numeric)
    raise TypeError if exclude_end? && !last.kind_of?(Integer)
    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) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb', line 78

def min(&block)
  val = self.begin
  last = self.end
  if block
    raise RangeError, "cannot get the minimum of endless range with custom comparison method" if last.nil?
    return super
  end
  return val if last.nil?

  # 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

#to_aObject

Raises:



77
78
79
80
# File 'ext/enterprise_script_service/mruby/mrblib/range.rb', line 77

def to_a
  raise RangeError, "cannot convert endless range to an array" if self.last.nil?
  super
end