Private method for Array creation.
ISO 15.2.12.5.15
# File mrblib/array.rb, line 67
def initialize(size=0, obj=nil, &block)
size = size.__to_int
raise ArgumentError, "negative array size" if size < 0
self.clear
if size > 0
self[size - 1] = nil # allocate
idx = 0
while idx < size
self[idx] = (block)? block.call(idx): obj
idx += 1
end
end
self
end
Set Intersection—Returns a new array containing elements common to the two arrays, with no duplicates.
[ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 152
def &(elem)
raise TypeError, "can't convert #{elem.class} into Array" unless elem.class == Array
hash = {}
array = []
idx = 0
len = elem.size
while idx < len
hash[elem[idx]] = true
idx += 1
end
idx = 0
len = size
while idx < len
v = self[idx]
if hash[v]
array << v
hash.delete v
end
idx += 1
end
array
end
Array Difference—Returns a new array that is a copy of the original array, removing any items that also appear in other_ary. (If you need set-like behavior, see the library class Set.)
[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 70
def -(elem)
raise TypeError, "can't convert #{elem.class} into Array" unless elem.class == Array
hash = {}
array = []
idx = 0
len = elem.size
while idx < len
hash[elem[idx]] = true
idx += 1
end
idx = 0
len = size
while idx < len
v = self[idx]
array << v unless hash[v]
idx += 1
end
array
end
Comparison---Returns an integer (-1, 0, or +1) if this array is less than, equal to, or greater than <i>other_ary</i>. Each object in each array is compared (using <=>). If any value isn't equal, then that inequality is the return value. If all the values found are equal, then the return is based on a comparison of the array lengths. Thus, two arrays are "equal" according to <code>Array#<=></code> if and only if they have the same length and the value of each element is equal to the value of the corresponding element in the other array.
ISO 15.2.12.5.36 (x)
# File mrblib/array.rb, line 157
def <=>(other)
other = self.__ary_cmp(other)
return 0 if 0 == other
return nil if nil == other
len = self.size
n = other.size
len = n if len > n
i = 0
while i < len
n = (self[i] <=> other[i])
return n if n.nil? || n != 0
i += 1
end
len = self.size - other.size
if len == 0
0
elsif len > 0
1
else
-1
end
end
Equality---Two arrays are equal if they contain the same number of elements and if each element is equal to (according to Object.==) the corresponding element in the other array.
ISO 15.2.12.5.33 (x)
# File mrblib/array.rb, line 114
def ==(other)
other = self.__ary_eq(other)
return false if other == false
return true if other == true
len = self.size
i = 0
while i < len
return false if self[i] != other[i]
i += 1
end
return true
end
# File mrblib/array.rb, line 85
def _inspect(recur_list)
size = self.size
return "[]" if size == 0
return "[...]" if recur_list[self.object_id]
recur_list[self.object_id] = true
ary=[]
i=0
while i<size
ary<<self[i]._inspect(recur_list)
i+=1
end
"["+ary.join(", ")+"]"
end
By using binary search, finds a value from this array which meets the given condition in O(log n) where n is the size of the array.
You can use this method in two use cases: a find-minimum mode and a find-any mode. In either case, the elements of the array must be monotone (or sorted) with respect to the block.
In find-minimum mode (this is a good choice for typical use case), the block must return true or false, and there must be an index i (0 <= i <= ary.size) so that:
the block returns false for any element whose index is less than i, and
the block returns true for any element whose index is greater than or equal to i.
This method returns the i-th element. If i is equal to ary.size, it returns nil.
ary = [0, 4, 7, 10, 12] ary.bsearch {|x| x >= 4 } #=> 4 ary.bsearch {|x| x >= 6 } #=> 7 ary.bsearch {|x| x >= -1 } #=> 0 ary.bsearch {|x| x >= 100 } #=> nil
In find-any mode (this behaves like libc's bsearch(3)), the block must return a number, and there must be two indices i and j (0 <= i <= j <= ary.size) so that:
the block returns a positive number for ary if 0 <= k < i,
the block returns zero for ary if i <= k < j, and
the block returns a negative number for ary if j <= k < ary.size.
Under this condition, this method returns any element whose index is within i…j. If i is equal to j (i.e., there is no element that satisfies the block), this method returns nil.
ary = [0, 4, 7, 10, 12] # try to find v such that 4 <= v < 8 ary.bsearch {|x| 1 - (x / 4).truncate } #=> 4 or 7 # try to find v such that 8 <= v < 10 ary.bsearch {|x| 4 - (x / 2).truncate } #=> nil
You must not mix the two modes at a time; the block must always return either true/false, or always return a number. It is undefined which value is actually picked up at each iteration.
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 614
def bsearch(&block)
return to_enum :bsearch unless block
if idx = bsearch_index(&block)
self[idx]
else
nil
end
end
By using binary search, finds an index of a value from this array which meets the given condition in O(log n) where n is the size of the array.
It supports two modes, depending on the nature of the block and they are exactly the same as in the case of bsearch method with the only difference being that this method returns the index of the element instead of the element itself. For more details consult the documentation for bsearch.
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 636
def bsearch_index(&block)
return to_enum :bsearch_index unless block
low = 0
high = size
satisfied = false
while low < high
mid = ((low+high)/2).truncate
res = block.call self[mid]
case res
when 0 # find-any mode: Found!
return mid
when Numeric # find-any mode: Continue...
in_lower_half = res < 0
when true # find-min mode
in_lower_half = true
satisfied = true
when false, nil # find-min mode
in_lower_half = false
else
raise TypeError, 'invalid block result (must be numeric, true, false or nil)'
end
if in_lower_half
high = mid
else
low = mid + 1
end
end
satisfied ? low : nil
end
Calls the given block for each element of self and pass the
respective element. Each element will be replaced by the resulting values.
ISO 15.2.12.5.7
# File mrblib/array.rb, line 45
def collect!(&block)
return to_enum :collect! unless block
idx = 0
len = size
while idx < len
self[idx] = block.call self[idx]
idx += 1
end
self
end
When invoked with a block, yields all combinations of length n
of elements from the array and then returns the array itself.
The implementation makes no guarantees about the order in which the combinations are yielded.
If no block is given, an Enumerator is returned instead.
Examples:
a = [1, 2, 3, 4] a.combination(1).to_a #=> [[1],[2],[3],[4]] a.combination(2).to_a #=> [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]] a.combination(3).to_a #=> [[1,2,3],[1,2,4],[1,3,4],[2,3,4]] a.combination(4).to_a #=> [[1,2,3,4]] a.combination(0).to_a #=> [[]] # one combination of length 0 a.combination(5).to_a #=> [] # no combinations of length 5
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 879
def combination(n, &block)
return to_enum(:combination, n) unless block
size = self.size
if n == 0
yield []
elsif n == 1
i = 0
while i<size
yield [self[i]]
i += 1
end
elsif n <= size
i = 0
while i<size
result = [self[i]]
self[i+1..-1].combination(n-1) do |c|
yield result + c
end
i += 1
end
end
self
end
Returns a copy of self with all nil elements
removed.
[ "a", nil, "b", nil, "c", nil ].compact #=> [ "a", "b", "c" ]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 247
def compact
result = self.dup
result.compact!
result
end
Removes nil elements from the array. Returns nil
if no changes were made, otherwise returns ary.
[ "a", nil, "b", nil, "c" ].compact! #=> [ "a", "b", "c" ] [ "a", "b", "c" ].compact! #=> nil
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 264
def compact!
result = self.select { |e| !e.nil? }
if result.size == self.size
nil
else
self.replace(result)
end
end
Delete element with index key
# File mrblib/array.rb, line 183
def delete(key, &block)
while i = self.index(key)
self.delete_at(i)
ret = key
end
return block.call if ret.nil? && block
ret
end
Deletes every element of self for which block evaluates to
true.
The array is changed instantly every time the block is called, not after the iteration is over.
See also #reject!
If no block is given, an Enumerator is returned instead.
scores = [ 97, 42, 75 ] scores.delete_if {|score| score < 80 } #=> [97]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 495
def delete_if(&block)
return to_enum :delete_if unless block
idx = 0
while idx < self.size do
if block.call(self[idx])
self.delete_at(idx)
else
idx += 1
end
end
self
end
Returns a new array that is a copy of the original array, removing all
occurrences of any item that also appear in other_ary. The
order is preserved from the original array.
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 135
def difference(*args)
ary = self.dup
args.each do |x|
ary = self - x
end
ary
end
Extracts the nested value specified by the sequence of idx objects
by calling dig at each step, returning nil if any
intermediate step is nil.
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 798
def dig(idx,*args)
n = self[idx]
if args.size > 0
n&.dig(*args)
else
n
end
end
Calls the given block for each element of self and pass the
index of the respective element.
ISO 15.2.12.5.11
# File mrblib/array.rb, line 28
def each_index(&block)
return to_enum :each_index unless block
idx = 0
while idx < length
block.call(idx)
idx += 1
end
self
end
Returns <code>true</code> if +self+ and _other_ are the same object, or are both arrays with the same content.
ISO 15.2.12.5.34 (x)
# File mrblib/array.rb, line 132
def eql?(other)
other = self.__ary_eq(other)
return false if other == false
return true if other == true
len = self.size
i = 0
while i < len
return false unless self[i].eql?(other[i])
i += 1
end
return true
end
Tries to return the element at position index, but throws an
IndexError exception if the referenced
index lies outside of the array bounds. This error can be
prevented by supplying a second argument, which will act as a
default value.
Alternatively, if a block is given it will only be executed when an invalid
index is referenced.
Negative values of index count from the end of the array.
a = [ 11, 22, 33, 44 ] a.fetch(1) #=> 22 a.fetch(-1) #=> 44 a.fetch(4, 'cat') #=> "cat" a.fetch(100) { |i| puts "#{i} is out of bounds" } #=> "100 is out of bounds"
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 309
def fetch(n, ifnone=NONE, &block)
warn "block supersedes default value argument" if !n.nil? && ifnone != NONE && block
idx = n
if idx < 0
idx += size
end
if idx < 0 || size <= idx
return block.call(n) if block
if ifnone == NONE
raise IndexError, "index #{n} outside of array bounds: #{-size}...#{size}"
end
return ifnone
end
self[idx]
end
The first three forms set the selected elements of self (which
may be the entire array) to obj.
A start of nil is equivalent
to zero.
A length of nil is
equivalent to the length of the array.
The last three forms fill the array with the value of the given block, which is passed the absolute index of each element to be filled.
Negative values of start count from the end of the array,
where -1 is the last element.
a = [ "a", "b", "c", "d" ] a.fill("x") #=> ["x", "x", "x", "x"] a.fill("w", -1) #=> ["x", "x", "x", "w"] a.fill("z", 2, 2) #=> ["x", "x", "z", "z"] a.fill("y", 0..1) #=> ["y", "y", "z", "z"] a.fill { |i| i*i } #=> [0, 1, 4, 9] a.fill(-2) { |i| i*i*i } #=> [0, 1, 8, 27] a.fill(1, 2) { |i| i+1 } #=> [0, 2, 3, 27] a.fill(0..1) { |i| i+1 } #=> [1, 2, 3, 27]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 359
def fill(arg0=nil, arg1=nil, arg2=nil, &block)
if arg0.nil? && arg1.nil? && arg2.nil? && !block
raise ArgumentError, "wrong number of arguments (0 for 1..3)"
end
beg = len = 0
ary = []
if block
if arg0.nil? && arg1.nil? && arg2.nil?
# ary.fill { |index| block } -> ary
beg = 0
len = self.size
elsif !arg0.nil? && arg0.kind_of?(Range)
# ary.fill(range) { |index| block } -> ary
beg = arg0.begin
beg += self.size if beg < 0
len = arg0.end
len += self.size if len < 0
len += 1 unless arg0.exclude_end?
elsif !arg0.nil?
# ary.fill(start [, length] ) { |index| block } -> ary
beg = arg0
beg += self.size if beg < 0
if arg1.nil?
len = self.size
else
len = arg0 + arg1
end
end
else
if !arg0.nil? && arg1.nil? && arg2.nil?
# ary.fill(obj) -> ary
beg = 0
len = self.size
elsif !arg0.nil? && !arg1.nil? && arg1.kind_of?(Range)
# ary.fill(obj, range ) -> ary
beg = arg1.begin
beg += self.size if beg < 0
len = arg1.end
len += self.size if len < 0
len += 1 unless arg1.exclude_end?
elsif !arg0.nil? && !arg1.nil?
# ary.fill(obj, start [, length]) -> ary
beg = arg1
beg += self.size if beg < 0
if arg2.nil?
len = self.size
else
len = beg + arg2
end
end
end
i = beg
if block
while i < len
self[i] = block.call(i)
i += 1
end
else
while i < len
self[i] = arg0
i += 1
end
end
self
end
Returns a new array that is a one-dimensional flattening of this array (recursively). That is, for every element that is an array, extract its elements into the new array. If the optional level argument determines the level of recursion to flatten.
s = [ 1, 2, 3 ] #=> [1, 2, 3] t = [ 4, 5, 6, [7, 8] ] #=> [4, 5, 6, [7, 8]] a = [ s, t, 9, 10 ] #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10] a.flatten #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] a = [ 1, 2, [3, [4, 5] ] ] a.flatten(1) #=> [1, 2, 3, [4, 5]]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 193
def flatten(depth=nil)
res = dup
res.flatten! depth
res
end
Flattens self in place. Returns nil if no
modifications were made (i.e., ary contains no subarrays.) If the
optional level argument determines the level of recursion to
flatten.
a = [ 1, 2, [3, [4, 5] ] ] a.flatten! #=> [1, 2, 3, 4, 5] a.flatten! #=> nil a #=> [1, 2, 3, 4, 5] a = [ 1, 2, [3, [4, 5] ] ] a.flatten!(1) #=> [1, 2, 3, [4, 5]]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 216
def flatten!(depth=nil)
modified = false
ar = []
idx = 0
len = size
while idx < len
e = self[idx]
if e.is_a?(Array) && (depth.nil? || depth > 0)
ar += e.flatten(depth.nil? ? nil : depth - 1)
modified = true
else
ar << e
end
idx += 1
end
if modified
self.replace(ar)
else
nil
end
end
Returns the _index_ of the first object in +ary+ such that the object is <code>==</code> to +obj+. If a block is given instead of an argument, returns the _index_ of the first object for which the block returns +true+. Returns +nil+ if no match is found.
ISO 15.2.12.5.14
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 774
def index(val=NONE, &block)
return to_enum(:find_index, val) if !block && val == NONE
if block
idx = 0
len = size
while idx < len
return idx if block.call self[idx]
idx += 1
end
else
return self.__ary_index(val)
end
nil
end
Inserts the given values before the element with the given
index.
Negative indices count backwards from the end of the array, where
-1 is the last element.
a = %w{ a b c d } a.insert(2, 99) #=> ["a", "b", 99, "c", "d"] a.insert(-2, 1, 2, 3) #=> ["a", "b", 99, "c", 1, 2, 3, "d"]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 556
def insert(idx, *args)
idx += self.size + 1 if idx < 0
self[idx, 0] = args
self
end
Return the contents of this array as a string.
ISO 15.2.12.5.31 (x)
# File mrblib/array.rb, line 102
def inspect
self._inspect({})
end
Deletes every element of self for which the given block
evaluates to false.
See also #select!
If no block is given, an Enumerator is returned instead.
a = [1, 2, 3, 4, 5] a.keep_if { |val| val > 3 } #=> [4, 5]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 717
def keep_if(&block)
return to_enum :keep_if unless block
idx = 0
len = self.size
while idx < self.size do
if block.call(self[idx])
idx += 1
else
self.delete_at(idx)
end
end
self
end
When invoked with a block, yield all permutations of length n
of the elements of the array, then return the array itself.
If n is not specified, yield all permutations of all elements.
The implementation makes no guarantees about the order in which the permutations are yielded.
If no block is given, an Enumerator is returned instead.
Examples:
a = [1, 2, 3] a.permutation.to_a #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] a.permutation(1).to_a #=> [[1],[2],[3]] a.permutation(2).to_a #=> [[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]] a.permutation(3).to_a #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] a.permutation(0).to_a #=> [[]] # one permutation of length 0 a.permutation(4).to_a #=> [] # no permutations of length 4
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 833
def permutation(n=self.size, &block)
return to_enum(:permutation, n) unless block
size = self.size
if n == 0
yield []
elsif 0 < n && n <= size
i = 0
while i<size
result = [self[i]]
if n-1 > 0
ary = self[0...i] + self[i+1..-1]
ary.permutation(n-1) do |c|
yield result + c
end
else
yield result
end
i += 1
end
end
self
end
Equivalent to #delete_if,
deleting elements from self for which the block evaluates to
true, but returns nil if no changes were made.
The array is changed instantly every time the block is called, not after the iteration is over.
See also Enumerable#reject and #delete_if.
If no block is given, an Enumerator is returned instead.
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 524
def reject!(&block)
return to_enum :reject! unless block
len = self.size
idx = 0
while idx < self.size do
if block.call(self[idx])
self.delete_at(idx)
else
idx += 1
end
end
if self.size == len
nil
else
self
end
end
for efficiency
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 274
def reverse_each(&block)
return to_enum :reverse_each unless block
i = self.size - 1
while i>=0
block.call(self[i])
i -= 1
end
self
end
Returns a new array by rotating self so that the element at
count is the first element of the new array.
If count is negative then it rotates in the opposite
direction, starting from the end of self where -1
is the last element.
a = [ "a", "b", "c", "d" ] a.rotate #=> ["b", "c", "d", "a"] a #=> ["a", "b", "c", "d"] a.rotate(2) #=> ["c", "d", "a", "b"] a.rotate(-3) #=> ["b", "c", "d", "a"]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 443
def rotate(count=1)
ary = []
len = self.length
if len > 0
idx = (count < 0) ? (len - (~count % len) - 1) : (count % len) # rotate count
len.times do
ary << self[idx]
idx += 1
idx = 0 if idx > len-1
end
end
ary
end
Rotates self in place so that the element at
count comes first, and returns self.
If count is negative then it rotates in the opposite
direction, starting from the end of the array where -1 is the
last element.
a = [ "a", "b", "c", "d" ] a.rotate! #=> ["b", "c", "d", "a"] a #=> ["b", "c", "d", "a"] a.rotate!(2) #=> ["d", "a", "b", "c"] a.rotate!(-3) #=> ["a", "b", "c", "d"]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 474
def rotate!(count=1)
self.replace(self.rotate(count))
end
Invokes the given block passing in successive elements from
self, deleting elements for which the block returns a
false value.
If changes were made, it will return self, otherwise it
returns nil.
See also #keep_if
If no block is given, an Enumerator is returned instead.
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 746
def select!(&block)
return to_enum :select! unless block
result = []
idx = 0
len = size
while idx < len
elem = self[idx]
result << elem if block.call(elem)
idx += 1
end
return nil if len == result.size
self.replace(result)
end
# File mrblib/array.rb, line 267
def sort(&block)
self.dup.sort!(&block)
end
Sort all elements and replace self with these elements.
# File mrblib/array.rb, line 202
def sort!(&block)
stack = [ [ 0, self.size - 1 ] ]
until stack.empty?
left, mid, right = stack.pop
if right == nil
right = mid
# sort self[left..right]
if left < right
if left + 1 == right
lval = self[left]
rval = self[right]
cmp = if block then block.call(lval,rval) else lval <=> rval end
if cmp.nil?
raise ArgumentError, "comparison of #{lval.inspect} and #{rval.inspect} failed"
end
if cmp > 0
self[left] = rval
self[right] = lval
end
else
mid = ((left + right + 1) / 2).floor
stack.push [ left, mid, right ]
stack.push [ mid, right ]
stack.push [ left, (mid - 1) ] if left < mid - 1
end
end
else
lary = self[left, mid - left]
lsize = lary.size
# The entity sharing between lary and self may cause a large memory
# copy operation in the merge loop below. This harmless operation
# cancels the sharing and provides a huge performance gain.
lary[0] = lary[0]
# merge
lidx = 0
ridx = mid
(left..right).each { |i|
if lidx >= lsize
break
elsif ridx > right
self[i, lsize - lidx] = lary[lidx, lsize - lidx]
break
else
lval = lary[lidx]
rval = self[ridx]
cmp = if block then block.call(lval,rval) else lval <=> rval end
if cmp.nil?
raise ArgumentError, "comparison of #{lval.inspect} and #{rval.inspect} failed"
end
if cmp <= 0
self[i] = lval
lidx += 1
else
self[i] = rval
ridx += 1
end
end
}
end
end
self
end
Returns the result of interpreting aray as an array of [key,
value] pairs. If a block is given, it should return [key,
value] pairs to construct a hash.
[[:foo, :bar], [1, 2]].to_h # => {:foo => :bar, 1 => 2} [1, 2].to_h{|x| [x, x*2]} # => {1 => 2, 2 => 4}
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 945
def to_h(&blk)
h = {}
self.each do |v|
v = blk.call(v) if blk
raise TypeError, "wrong element type #{v.class}" unless Array === v
raise ArgumentError, "wrong array length (expected 2, was #{v.length})" unless v.length == 2
h[v[0]] = v[1]
end
h
end
Assumes that self is an array of arrays and transposes the rows and columns.
If the length of the subarrays don't match, an IndexError is raised.
Examples:
a = [[1,2], [3,4], [5,6]] a.transpose #=> [[1, 3, 5], [2, 4, 6]]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 916
def transpose
return [] if empty?
column_count = nil
self.each do |row|
raise TypeError unless row.is_a?(Array)
column_count ||= row.size
raise IndexError, 'element size differs' unless column_count == row.size
end
Array.new(column_count) do |column_index|
self.map { |row| row[column_index] }
end
end
Set Union—Returns a new array by joining this array with other_ary, removing duplicates.
["a", "b", "c"].union(["c", "d", "a"], ["a", "c", "e"]) #=> ["a", "b", "c", "d", "e"]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 118
def union(*args)
ary = self.dup
args.each do |x|
ary.concat(x)
ary.uniq!
end
ary
end
Returns a new array by removing duplicate values in self.
a = [ "a", "a", "b", "b", "c" ] a.uniq #=> ["a", "b", "c"] b = [["student","sam"], ["student","george"], ["teacher","matz"]] b.uniq { |s| s.first } # => [["student", "sam"], ["teacher", "matz"]]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 53
def uniq(&block)
ary = self.dup
ary.uniq!(&block)
ary
end
Removes duplicate elements from self. Returns nil
if no changes are made (that is, no duplicates are found).
a = [ "a", "a", "b", "b", "c" ] a.uniq! #=> ["a", "b", "c"] b = [ "a", "b", "c" ] b.uniq! #=> nil c = [["student","sam"], ["student","george"], ["teacher","matz"]] c.uniq! { |s| s.first } # => [["student", "sam"], ["teacher", "matz"]]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 18
def uniq!(&block)
hash = {}
if block
self.each do |val|
key = block.call(val)
hash[key] = val unless hash.key?(key)
end
result = hash.values
else
hash = {}
self.each do |val|
hash[val] = val
end
result = hash.keys
end
if result.size == self.size
nil
else
self.replace(result)
end
end
Set Union—Returns a new array by joining this array with other_ary, removing duplicates.
[ "a", "b", "c" ] | [ "c", "d", "a" ] #=> [ "a", "b", "c", "d" ]
# File mrbgems/mruby-array-ext/mrblib/array.rb, line 101
def |(elem)
raise TypeError, "can't convert #{elem.class} into Array" unless elem.class == Array
ary = self + elem
ary.uniq! or ary
end