Array is enumerable and comparable
ISO 15.3.2 The <code>Enumerable</code> mixin provides collection classes with several traversal and searching methods, and with the ability to sort. The class must provide a method <code>each</code>, which yields successive members of the collection. If <code>Enumerable#max</code>, <code>#min</code>, or <code>#sort</code> is used, the objects in the collection must also implement a meaningful <code><=></code> operator, as these methods rely on an ordering between members of the collection.
Hash is enumerable
ISO 15.2.13.3
Range is enumerable
ISO 15.2.14.3
TODO Does this OK? Please test it.
# File mrblib/enum.rb, line 339
def __sort_sub__(sorted, work, src_ary, head, tail, &block)
if head == tail
sorted[head] = work[head] if src_ary == 1
return
end
# on current step, which is a src ary?
if src_ary == 0
src, dst = sorted, work
else
src, dst = work, sorted
end
key = src[head] # key value for dividing values
i, j = head, tail # position to store on the dst ary
(head + 1).upto(tail){|idx|
if ((block)? block.call(src[idx], key): (src[idx] <=> key)) > 0
# larger than key
dst[j] = src[idx]
j -= 1
else
dst[i] = src[idx]
i += 1
end
}
sorted[i] = key
# sort each sub-array
src_ary = (src_ary + 1) % 2 # exchange a src ary
__sort_sub__(sorted, work, src_ary, head, i - 1, &block) if i > head
__sort_sub__(sorted, work, src_ary, i + 1, tail, &block) if i < tail
end
Call the given block for each element which is yield by each.
Return false if one block value is false. Otherwise return true. If no
block is given and self is false return false.
ISO 15.3.2.2.1
# File mrblib/enum.rb, line 25
def all?(&block)
st = true
if block
self.each{|val|
unless block.call(val)
st = false
break
end
}
else
self.each{|val|
unless val
st = false
break
end
}
end
st
end
Call the given block for each element which is yield by each.
Return true if one block value is true. Otherwise return false. If no block
is given and self is true object return true.
ISO 15.3.2.2.2
# File mrblib/enum.rb, line 53
def any?(&block)
st = false
if block
self.each{|val|
if block.call(val)
st = true
break
end
}
else
self.each{|val|
if val
st = true
break
end
}
end
st
end
Call the given block for each element which is yield by each.
Append all values of each block together and return this value.
ISO 15.3.2.2.3
# File mrblib/enum.rb, line 80
def collect(&block)
ary = []
self.each{|val|
ary.push(block.call(val))
}
ary
end
Call the given block for each element which is yield by each.
Return ifnone if no block value was true. Otherwise return the
first block value which had was true.
ISO 15.3.2.2.4
# File mrblib/enum.rb, line 96
def detect(ifnone=nil, &block)
ret = ifnone
self.each{|val|
if block.call(val)
ret = val
break
end
}
ret
end
Drops first n elements from enum, and returns rest elements in an array.
a = [1, 2, 3, 4, 5, 0] a.drop(3) #=> [4, 5, 0]
# File mrbgems/mruby-enum-ext/mrblib/enum.rb, line 15
def drop(n)
raise TypeError, "expected Integer for 1st argument" unless n.kind_of? Integer
raise ArgumentError, "attempt to drop negative size" if n < 0
ary = []
self.each {|e| n == 0 ? ary << e : n -= 1 }
ary
end
Drops elements up to, but not including, the first element for which the
block returns nil or false and returns an array
containing the remaining elements.
a = [1, 2, 3, 4, 5, 0] a.drop_while {|i| i < 3 } #=> [3, 4, 5, 0]
# File mrbgems/mruby-enum-ext/mrblib/enum.rb, line 35
def drop_while(&block)
ary, state = [], false
self.each do |e|
state = true if !state and !block.call(e)
ary << e if state
end
ary
end
Iterates the given block for each array of consecutive <n> elements.
e.g.:
(1..10).each_cons(3) {|a| p a} # outputs below [1, 2, 3] [2, 3, 4] [3, 4, 5] [4, 5, 6] [5, 6, 7] [6, 7, 8] [7, 8, 9] [8, 9, 10]
# File mrbgems/mruby-enum-ext/mrblib/enum.rb, line 104
def each_cons(n, &block)
raise TypeError, "expected Integer for 1st argument" unless n.kind_of? Integer
raise ArgumentError, "invalid size" if n <= 0
ary = []
self.each do |e|
ary.shift if ary.size == n
ary << e
block.call(ary.dup) if ary.size == n
end
end
Iterates the given block for each slice of <n> elements.
e.g.:
(1..10).each_slice(3) {|a| p a} # outputs below [1, 2, 3] [4, 5, 6] [7, 8, 9] [10]
# File mrbgems/mruby-enum-ext/mrblib/enum.rb, line 130
def each_slice(n, &block)
raise TypeError, "expected Integer for 1st argument" unless n.kind_of? Integer
raise ArgumentError, "invalid slice size" if n <= 0
ary = []
self.each do |e|
ary << e
if ary.size == n
block.call(ary)
ary = []
end
end
block.call(ary) unless ary.empty?
end
Call the given block for each element which is yield by each.
Pass an index to the block which starts at 0 and increase by 1 for each
element.
ISO 15.3.2.2.5
# File mrblib/enum.rb, line 114
def each_with_index(&block)
i = 0
self.each{|val|
block.call(val, i)
i += 1
}
self
end
Return an array of all elements which are yield by each.
ISO 15.3.2.2.6
# File mrblib/enum.rb, line 128
def entries
ary = []
self.each{|val|
ary.push val
}
ary
end
Call the given block for each element which is yield by each.
Return an array which contains all elements whose block value was true.
ISO 15.3.2.2.8
# File mrblib/enum.rb, line 149
def find_all(&block)
ary = []
self.each{|val|
ary.push(val) if block.call(val)
}
ary
end
Call the given block for each element which is yield by each
and which return value was true when invoking === with
pattern. Return an array with all elements or the respective
block values.
ISO 15.3.2.2.9
# File mrblib/enum.rb, line 165
def grep(pattern, &block)
ary = []
self.each{|val|
if pattern === val
ary.push((block)? block.call(val): val)
end
}
ary
end
Returns a hash, which keys are evaluated result from the block, and values are arrays of elements in enum corresponding to the key.
(1..6).group_by {|i| i%3} #=> {0=>[3, 6], 1=>[1, 4], 2=>[2, 5]}
# File mrbgems/mruby-enum-ext/mrblib/enum.rb, line 155
def group_by(&block)
h = {}
self.each do |e|
key = block.call(e)
h.key?(key) ? (h[key] << e) : (h[key] = [e])
end
h
end
Return true if at least one element which is yield by each
returns a true value by invoking == with obj. Otherwise return
false.
ISO 15.3.2.2.10
# File mrblib/enum.rb, line 182
def include?(obj)
st = false
self.each{|val|
if val == obj
st = true
break
end
}
st
end
Call the given block for each element which is yield by each.
Return value is the sum of all block values. Pass to each block the current
sum and the current element.
ISO 15.3.2.2.11
# File mrblib/enum.rb, line 201
def inject(*args, &block)
raise ArgumentError, "too many arguments" if args.size > 2
if Symbol === args[-1]
sym = args[-1]
block = ->(x,y){x.send(sym,y)}
args.pop
end
if args.empty?
flag = true # no initial argument
result = nil
else
flag = false
result = args[0]
end
self.each{|val|
if flag
# push first element as initial
flag = false
result = val
else
result = block.call(result, val)
end
}
result
end
Return the maximum value of all elements yield by each. If no
block is given <=> will be invoked to define this value. If a block
is given it will be used instead.
ISO 15.3.2.2.13
# File mrblib/enum.rb, line 241
def max(&block)
flag = true # 1st element?
result = nil
self.each{|val|
if flag
# 1st element
result = val
flag = false
else
if block
result = val if block.call(val, result) > 0
else
result = val if (val <=> result) > 0
end
end
}
result
end
Return the minimum value of all elements yield by each. If no
block is given <=> will be invoked to define this value. If a block
is given it will be used instead.
ISO 15.3.2.2.14
# File mrblib/enum.rb, line 267
def min(&block)
flag = true # 1st element?
result = nil
self.each{|val|
if flag
# 1st element
result = val
flag = false
else
if block
result = val if block.call(val, result) < 0
else
result = val if (val <=> result) < 0
end
end
}
result
end
Call the given block for each element which is yield by each.
Return an array which contains two arrays. The first array contains all
elements whose block value was true. The second array contains all elements
whose block value was false.
ISO 15.3.2.2.16
# File mrblib/enum.rb, line 302
def partition(&block)
ary_T = []
ary_F = []
self.each{|val|
if block.call(val)
ary_T.push(val)
else
ary_F.push(val)
end
}
[ary_T, ary_F]
end
Call the given block for each element which is yield by each.
Return an array which contains only the elements whose block value was
false.
ISO 15.3.2.2.17
# File mrblib/enum.rb, line 322
def reject(&block)
ary = []
self.each{|val|
ary.push(val) unless block.call(val)
}
ary
end
Return a sorted array of all elements which are yield by each.
If no block is given <=> will be invoked on each element to define
the order. Otherwise the given block will be used for sorting.
ISO 15.3.2.2.19
# File mrblib/enum.rb, line 384
def sort(&block)
ary = []
self.each{|val| ary.push(val)}
unless ary.empty?
__sort_sub__(ary, ::Array.new(ary.size), 0, 0, ary.size - 1, &block)
end
ary
end
Returns first n elements from enum.
a = [1, 2, 3, 4, 5, 0] a.take(3) #=> [1, 2, 3]
# File mrbgems/mruby-enum-ext/mrblib/enum.rb, line 53
def take(n)
raise TypeError, "expected Integer for 1st argument" unless n.kind_of? Integer
raise ArgumentError, "attempt to take negative size" if n < 0
ary = []
self.each do |e|
break if ary.size >= n
ary << e
end
ary
end
Passes elements to the block until the block returns nil or
false, then stops iterating and returns an array of all prior
elements.
a = [1, 2, 3, 4, 5, 0] a.take_while {|i| i < 3 } #=> [1, 2]
# File mrbgems/mruby-enum-ext/mrblib/enum.rb, line 76
def take_while(&block)
ary = []
self.each do |e|
return ary unless block.call(e)
ary << e
end
ary
end
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please see Improve the docs, or visit Documenting-ruby.org.