Class: Array
- Includes:
- Enumerable
- Defined in:
- ext/enterprise_script_service/mruby/mrblib/array.rb,
ext/enterprise_script_service/mruby/mrblib/array.rb,
ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb
Overview
Array is enumerable
Direct Known Subclasses
Constant Summary collapse
- NONE =
Object.new
Class Method Summary collapse
-
.try_convert(obj) ⇒ Object
call-seq: Array.try_convert(obj) -> array or nil.
Instance Method Summary collapse
-
#&(elem) ⇒ Object
call-seq: ary & other_ary -> new_ary.
-
#-(elem) ⇒ Object
call-seq: ary - other_ary -> new_ary.
-
#<=>(other) ⇒ Object
Comparison—Returns an integer (-1, 0, or +1) if this array is less than, equal to, or greater than other_ary.
-
#==(other) ⇒ Object
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.
-
#__sort_sub__(a, left, right, &block) ⇒ Object
Quick sort a : the array to sort left : the beginning of sort region right : the end of sort region.
-
#__svalue ⇒ Object
internal method to convert multi-value to single value.
- #_inspect ⇒ Object
-
#bsearch(&block) ⇒ Object
call-seq: ary.bsearch {|x| block } -> elem.
-
#bsearch_index(&block) ⇒ Object
call-seq: ary.bsearch_index {|x| block } -> int or nil.
-
#collect!(&block) ⇒ Object
(also: #map!)
Calls the given block for each element of
selfand pass the respective element. -
#combination(n, &block) ⇒ Object
call-seq: ary.combination(n) { |c| block } -> ary ary.combination(n) -> Enumerator.
-
#compact ⇒ Object
call-seq: ary.compact -> new_ary.
-
#compact! ⇒ Object
call-seq: ary.compact! -> ary or nil.
-
#delete(key, &block) ⇒ Object
Delete element with index
key. -
#delete_if(&block) ⇒ Object
call-seq: ary.delete_if { |item| block } -> ary ary.delete_if -> Enumerator.
-
#dig(idx, *args) ⇒ Object
call-seq: ary.dig(idx, …) -> object.
-
#each(&block) ⇒ Object
Calls the given block for each element of
selfand pass the respective element. -
#each_index(&block) ⇒ Object
Calls the given block for each element of
selfand pass the index of the respective element. -
#eql?(other) ⇒ Boolean
Returns
trueifselfand other are the same object, or are both arrays with the same content. -
#fetch(n = nil, ifnone = NONE, &block) ⇒ Object
call-seq: ary.fetch(index) -> obj ary.fetch(index, default) -> obj ary.fetch(index) { |index| block } -> obj.
-
#fill(arg0 = nil, arg1 = nil, arg2 = nil, &block) ⇒ Object
call-seq: ary.fill(obj) -> ary ary.fill(obj, start [, length]) -> ary ary.fill(obj, range ) -> ary ary.fill { |index| block } -> ary ary.fill(start [, length] ) { |index| block } -> ary ary.fill(range) { |index| block } -> ary.
-
#flatten(depth = nil) ⇒ Object
call-seq: ary.flatten -> new_ary ary.flatten(level) -> new_ary.
-
#flatten!(depth = nil) ⇒ Object
call-seq: ary.flatten! -> ary or nil ary.flatten!(level) -> array or nil.
-
#index(val = NONE, &block) ⇒ Object
call-seq: ary.index(val) -> int or nil ary.index {|item| block } -> int or nil.
-
#initialize(size = 0, obj = nil, &block) ⇒ Array
constructor
Private method for Array creation.
-
#insert(idx, *args) ⇒ Object
call-seq: ary.insert(index, obj…) -> ary.
-
#inspect ⇒ Object
(also: #to_s)
Return the contents of this array as a string.
-
#keep_if(&block) ⇒ Object
call-seq: ary.keep_if { |item| block } -> ary ary.keep_if -> Enumerator.
-
#permutation(n = self.size, &block) ⇒ Object
call-seq: ary.permutation { |p| block } -> ary ary.permutation -> Enumerator ary.permutation(n) { |p| block } -> ary ary.permutation(n) -> Enumerator.
-
#reject!(&block) ⇒ Object
call-seq: ary.reject! { |item| block } -> ary or nil ary.reject! -> Enumerator.
-
#reverse_each(&block) ⇒ Object
for efficiency.
-
#rotate(count = 1) ⇒ Object
call-seq: ary.rotate(count=1) -> new_ary.
-
#rotate!(count = 1) ⇒ Object
call-seq: ary.rotate!(count=1) -> ary.
-
#select!(&block) ⇒ Object
call-seq: ary.select! {|item| block } -> ary or nil ary.select! -> Enumerator.
- #sort(&block) ⇒ Object
-
#sort!(&block) ⇒ Object
Sort all elements and replace
selfwith these elements. -
#to_ary ⇒ Object
call-seq: ary.to_ary -> ary.
-
#transpose ⇒ Object
call-seq: ary.transpose -> new_ary.
-
#uniq(&block) ⇒ Object
call-seq: ary.uniq -> new_ary ary.uniq { |item| … } -> new_ary.
-
#uniq!(&block) ⇒ Object
call-seq: ary.uniq! -> ary or nil ary.uniq! { |item| … } -> ary or nil.
-
#|(elem) ⇒ Object
call-seq: ary | other_ary -> new_ary.
Methods included from Enumerable
#all?, #any?, #collect, #count, #cycle, #detect, #drop, #drop_while, #each_cons, #each_slice, #each_with_index, #each_with_object, #entries, #find_all, #find_index, #first, #flat_map, #grep, #group_by, #hash, #include?, #inject, #lazy, #max, #max_by, #min, #min_by, #minmax, #minmax_by, #none?, #one?, #partition, #reject, #sort_by, #take, #take_while, #to_h, to_h, #zip
Constructor Details
#initialize(size = 0, obj = nil, &block) ⇒ Array
Private method for Array creation.
ISO 15.2.12.5.15
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 68 def initialize(size=0, obj=nil, &block) raise TypeError, "expected Integer for 1st argument" unless size.kind_of? Integer 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 |
Class Method Details
.try_convert(obj) ⇒ Object
call-seq:
Array.try_convert(obj) -> array or nil
Tries to convert obj into an array, using to_ary method. converted array or nil if obj cannot be converted for any reason. This method can be used to check if an argument is an array.
Array.try_convert([1]) #=> [1]
Array.try_convert("1") #=> nil
if tmp = Array.try_convert(arg)
# the argument is an array
elsif tmp = String.try_convert(arg)
# the argument is a string
end
19 20 21 22 23 24 25 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 19 def self.try_convert(obj) if obj.respond_to?(:to_ary) obj.to_ary else nil end end |
Instance Method Details
#&(elem) ⇒ Object
call-seq:
ary & other_ary -> new_ary
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 ]
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 146 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 |
#-(elem) ⇒ Object
call-seq:
ary - other_ary -> new_ary
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 ]
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 99 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 |
#<=>(other) ⇒ Object
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)
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 153 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 |
#==(other) ⇒ Object
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)
110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 110 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 |
#__sort_sub__(a, left, right, &block) ⇒ Object
Quick sort a : the array to sort left : the beginning of sort region right : the end of sort region
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 206 def __sort_sub__(a, left, right, &block) if left < right i = left j = right pivot = a[i + (j - i) / 2] while true while ((block)? block.call(a[i], pivot): (a[i] <=> pivot)) < 0 i += 1 end while ((block)? block.call(pivot, a[j]): (pivot <=> a[j])) < 0 j -= 1 end break if (i >= j) tmp = a[i]; a[i] = a[j]; a[j] = tmp; i += 1 j -= 1 end __sort_sub__(a, left, i-1, &block) __sort_sub__(a, j+1, right, &block) end end |
#__svalue ⇒ Object
internal method to convert multi-value to single value
189 190 191 192 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 189 def __svalue return self.first if self.size < 2 self end |
#_inspect ⇒ Object
86 87 88 89 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 86 def _inspect return "[]" if self.size == 0 "["+self.map{|x|x.inspect}.join(", ")+"]" end |
#bsearch(&block) ⇒ Object
call-seq:
ary.bsearch {|x| block } -> elem
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[k] if 0 <= k < i,
- the block returns zero for ary[k] if i <= k < j, and
- the block returns a negative number for ary[k] 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.
609 610 611 612 613 614 615 616 617 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 609 def bsearch(&block) return to_enum :bsearch unless block if idx = bsearch_index(&block) self[idx] else nil end end |
#bsearch_index(&block) ⇒ Object
call-seq:
ary.bsearch_index {|x| block } -> int or nil
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.
631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 631 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 |
#collect!(&block) ⇒ Object Also known as: map!
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
46 47 48 49 50 51 52 53 54 55 56 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 46 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 |
#combination(n, &block) ⇒ Object
call-seq:
ary.combination(n) { |c| block } -> ary
ary.combination(n) -> Enumerator
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
884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 884 def combination(n, &block) size = self.size return to_enum(:combination, n) unless block return if n > size if n == 0 yield [] elsif n == 1 i = 0 while i<size yield [self[i]] i += 1 end else 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 end |
#compact ⇒ Object
call-seq:
ary.compact -> new_ary
Returns a copy of self with all nil elements removed.
[ "a", nil, "b", nil, "c", nil ].compact
#=> [ "a", "b", "c" ]
241 242 243 244 245 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 241 def compact result = self.dup result.compact! result end |
#compact! ⇒ Object
call-seq:
ary.compact! -> ary or nil
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
258 259 260 261 262 263 264 265 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 258 def compact! result = self.select { |e| !e.nil? } if result.size == self.size nil else self.replace(result) end end |
#delete(key, &block) ⇒ Object
Delete element with index key
179 180 181 182 183 184 185 186 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 179 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 |
#delete_if(&block) ⇒ Object
call-seq:
ary.delete_if { |item| block } -> ary
ary.delete_if -> Enumerator
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 Array#reject!
If no block is given, an Enumerator is returned instead.
scores = [ 97, 42, 75 ]
scores.delete_if {|score| score < 80 } #=> [97]
490 491 492 493 494 495 496 497 498 499 500 501 502 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 490 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 |
#dig(idx, *args) ⇒ Object
call-seq:
ary.dig(idx, ...) -> object
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.
803 804 805 806 807 808 809 810 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 803 def dig(idx,*args) n = self[idx] if args.size > 0 n&.dig(*args) else n end end |
#each(&block) ⇒ Object
Calls the given block for each element of self and pass the respective element.
ISO 15.2.12.5.10
13 14 15 16 17 18 19 20 21 22 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 13 def each(&block) return to_enum :each unless block idx = 0 while idx < length block.call(self[idx]) idx += 1 end self end |
#each_index(&block) ⇒ Object
Calls the given block for each element of self and pass the index of the respective element.
ISO 15.2.12.5.11
29 30 31 32 33 34 35 36 37 38 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 29 def each_index(&block) return to_enum :each_index unless block idx = 0 while idx < length block.call(idx) idx += 1 end self end |
#eql?(other) ⇒ Boolean
Returns true if self and other are the same object,
or are both arrays with the same content.
ISO 15.2.12.5.34 (x)
128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 128 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 |
#fetch(n = nil, ifnone = NONE, &block) ⇒ Object
call-seq:
ary.fetch(index) -> obj
ary.fetch(index, default) -> obj
ary.fetch(index) { |index| block } -> obj
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 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"
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 304 def fetch(n=nil, 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 |
#fill(arg0 = nil, arg1 = nil, arg2 = nil, &block) ⇒ Object
call-seq:
ary.fill(obj) -> ary
ary.fill(obj, start [, length]) -> ary
ary.fill(obj, range ) -> ary
ary.fill { |index| block } -> ary
ary.fill(start [, length] ) { |index| block } -> ary
ary.fill(range) { |index| block } -> ary
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]
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 354 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 |
#flatten(depth = nil) ⇒ Object
call-seq:
ary.flatten -> new_ary
ary.flatten(level) -> new_ary
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]]
187 188 189 190 191 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 187 def flatten(depth=nil) res = dup res.flatten! depth res end |
#flatten!(depth = nil) ⇒ Object
call-seq:
ary.flatten! -> ary or nil
ary.flatten!(level) -> array or nil
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]]
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 210 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 |
#index(val = NONE, &block) ⇒ Object
call-seq:
ary.index(val) -> int or nil
ary.index {|item| block } -> int or nil
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
769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 769 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 |
#insert(idx, *args) ⇒ Object
call-seq:
ary.insert(index, obj...) -> ary
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"]
551 552 553 554 555 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 551 def insert(idx, *args) idx += self.size + 1 if idx < 0 self[idx, 0] = args self end |
#inspect ⇒ Object Also known as: to_s
Return the contents of this array as a string.
ISO 15.2.12.5.31 (x)
94 95 96 97 98 99 100 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 94 def inspect begin self._inspect rescue SystemStackError "[...]" end end |
#keep_if(&block) ⇒ Object
call-seq:
ary.keep_if { |item| block } -> ary
ary.keep_if -> Enumerator
Deletes every element of +self+ for which the given block evaluates to
+false+.
See also Array#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]
712 713 714 715 716 717 718 719 720 721 722 723 724 725 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 712 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 |
#permutation(n = self.size, &block) ⇒ Object
call-seq:
ary.permutation { |p| block } -> ary
ary.permutation -> Enumerator
ary.permutation(n) { |p| block } -> ary
ary.permutation(n) -> Enumerator
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
838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 838 def permutation(n=self.size, &block) size = self.size return to_enum(:permutation, n) unless block return if n > size if n == 0 yield [] else 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 end |
#reject!(&block) ⇒ Object
call-seq:
ary.reject! { |item| block } -> ary or nil
ary.reject! -> Enumerator
Equivalent to Array#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 Array#delete_if.
If no block is given, an Enumerator is returned instead.
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 519 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 |
#reverse_each(&block) ⇒ Object
for efficiency
268 269 270 271 272 273 274 275 276 277 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 268 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 |
#rotate(count = 1) ⇒ Object
call-seq:
ary.rotate(count=1) -> new_ary
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"]
438 439 440 441 442 443 444 445 446 447 448 449 450 451 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 438 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 |
#rotate!(count = 1) ⇒ Object
call-seq:
ary.rotate!(count=1) -> ary
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"]
469 470 471 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 469 def rotate!(count=1) self.replace(self.rotate(count)) end |
#select!(&block) ⇒ Object
call-seq:
ary.select! {|item| block } -> ary or nil
ary.select! -> Enumerator
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 Array#keep_if
If no block is given, an Enumerator is returned instead.
741 742 743 744 745 746 747 748 749 750 751 752 753 754 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 741 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 |
#sort(&block) ⇒ Object
240 241 242 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 240 def sort(&block) self.dup.sort!(&block) end |
#sort!(&block) ⇒ Object
Sort all elements and replace self with these elements.
232 233 234 235 236 237 238 |
# File 'ext/enterprise_script_service/mruby/mrblib/array.rb', line 232 def sort!(&block) size = self.size if size > 1 __sort_sub__(self, 0, size - 1, &block) end self end |
#to_ary ⇒ Object
call-seq:
ary.to_ary -> ary
Returns +self+.
791 792 793 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 791 def to_ary self end |
#transpose ⇒ Object
call-seq:
ary.transpose -> new_ary
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]]
921 922 923 924 925 926 927 928 929 930 931 932 933 934 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 921 def transpose return [] if empty? column_count = nil self.each do |row| raise TypeError unless row.is_a?(Array) column_count ||= row.count raise IndexError, 'element size differs' unless column_count == row.count end Array.new(column_count) do |column_index| self.map { |row| row[column_index] } end end |
#uniq(&block) ⇒ Object
call-seq:
ary.uniq -> new_ary
ary.uniq { |item| ... } -> new_ary
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"]]
82 83 84 85 86 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 82 def uniq(&block) ary = self.dup ary.uniq!(&block) ary end |
#uniq!(&block) ⇒ Object
call-seq:
ary.uniq! -> ary or nil
ary.uniq! { |item| ... } -> ary or nil
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"]]
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 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 43 def uniq!(&block) ary = self.dup result = [] if block hash = {} while ary.size > 0 val = ary.shift key = block.call(val) hash[key] = val unless hash.has_key?(key) end hash.each_value do |value| result << value end else while ary.size > 0 result << ary.shift ary.delete(result.last) end end if result.size == self.size nil else self.replace(result) end end |
#|(elem) ⇒ Object
call-seq:
ary | other_ary -> new_ary
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" ]
130 131 132 133 134 135 |
# File 'ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb', line 130 def |(elem) raise TypeError, "can't convert #{elem.class} into Array" unless elem.class == Array ary = self + elem ary.uniq! or ary end |