class Array(T)
Overview
An Array is an ordered, integer-indexed collection of objects of type T.
Array indexing starts at 0. A negative index is assumed to be relative to the end of the array: -1 indicates the last element, -2 is the next to last element, and so on.
An Array can be created using the usual .new
method (several are provided), or with an array literal:
Array(Int32).new # => []
[1, 2, 3] # Array(Int32)
[1, "hello", 'x'] # Array(Int32 | String | Char)
An Array can have mixed types, meaning T will be a union of types, but these are determined when the array is created, either by specifying T or by using an array literal. In the latter case, T will be set to the union of the array literal elements' types.
When creating an empty array you must always specify T:
[] of Int32 # same as Array(Int32)
[] # syntax error
An Array is implemented using an internal buffer of some capacity and is reallocated when elements are pushed to it when more capacity is needed. This is normally known as a dynamic array.
You can use a special array literal syntax with other types too, as long as they define an argless
.new
method and a #<<
method. Set
is one such type:
set = Set{1, 2, 3} # => [1, 2, 3]
set.class # => Set(Int32)
The above is the same as this:
set = Set(typeof(1, 2, 3)).new
set << 1
set << 2
set << 3
Included Modules
Defined in:
array.crjson/to_json.cr
yaml/to_yaml.cr
Class Method Summary
-
.build(capacity : Int, &block)
Creates a new Array, allocating an internal buffer with the given capacity, and yielding that buffer.
- .each_product(arrays, &block)
- .each_product(*arrays : Array, &block)
-
.from_json(string_or_io, &block) : Nil
Parses a String or IO denoting a JSON array, yielding each of its elements to the given block.
- .from_yaml(string : String, &block)
- .new(pull : JSON::PullParser)
-
.new(size : Int, &block : Int32 -> T)
Creates a new Array of the given size and invokes the given block once for each index of
self
, assigning the block's value in that index. - .new(pull : YAML::PullParser)
- .new(pull : YAML::PullParser, &block)
- .new(pull : JSON::PullParser, &block)
- .product(arrays)
- .product(*arrays : Array)
-
.new(size : Int, value : T)
Creates a new Array of the given size filled with the same value in each position.
-
.new(initial_capacity : Int)
Creates a new empty Array backed by a buffer that is initially
initial_capacity
big. -
.new
Creates a new empty Array.
Instance Method Summary
-
#&(other : Array(U))
Set intersection: returns a new Array containing elements common to
self
and other, excluding any duplicates. -
#*(times : Int)
Repetition: Returns a new Array built by concatenating times copies of
self
. -
#+(other : Array(U))
Concatenation.
-
#-(other : Array(U))
Difference.
-
#<<(value : T)
Append.
-
#<=>(other : Array)
Combined comparison operator.
-
#==(other : Array)
Equality.
-
#[](index : Int)
Returns the element at the given index.
-
#[](range : Range(Int, Int))
Returns all elements that are within the given range.
-
#[](start : Int, count : Int)
Returns count or less (if there aren't enough) elements starting at the given start index.
-
#[]=(index : Int, value : T)
Sets the given value at the given index.
-
#[]=(index : Int, count : Int, values : Array(T))
Replaces a subrange with the elements of the given array.
-
#[]=(range : Range(Int, Int), values : Array(T))
Replaces a subrange with the elements of the given array.
-
#[]=(range : Range(Int, Int), value : T)
Replaces a subrange with a single value.
-
#[]=(index : Int, count : Int, value : T)
Replaces a subrange with a single value.
-
#[]?(index : Int)
Returns the element at the given index.
-
#at(index : Int, &block)
Returns the element at the given index, if in bounds, otherwise executes the given block and returns its value.
-
#at(index : Int)
Returns the element at the given index, if in bounds, otherwise raises
IndexError
. -
#bsearch(&block)
By using binary search, returns the first element for which the passed block returns
true
. -
#bsearch_index(&block)
By using binary search, returns the index of the first element for which the passed block returns
true
. -
#clear
Removes all elements from self.
-
#clone
Returns a new Array that has
self
's elements cloned. - #combinations(size : Int = self.size)
-
#compact
Returns a copy of self with all
nil
elements removed. -
#compact!
Removes all
nil
elements fromself
. -
#concat(other : Array)
Appends the elements of other to
self
, and returnsself
. -
#concat(other : Enumerable)
Appends the elements of other to
self
, and returnsself
. -
#delete(obj)
Removes all items from
self
that are equal to obj. -
#delete_at(index : Int, count : Int)
Removes count elements from
self
starting at index. -
#delete_at(index : Int)
Removes the element at index, returning that element.
-
#delete_at(range : Range(Int, Int))
Removes all elements within the given range.
-
#dup
Returns a new Array that has exactly
self
's elements. -
#each(&block)
Calls the given block once for each element in
self
, passing that element as a parameter. -
#each
Returns an
Iterator
for the elements ofself
. - #each_combination(size : Int = self.size, &block)
- #each_combination(size : Int = self.size)
-
#each_index
Returns an
Iterator
for each index inself
. -
#each_index(&block)
Calls the given block once for each index in
self
, passing that index as a parameter. -
#each_permutation(size : Int = self.size)
Returns an
Iterator
over each possible permutation of size ofself
. -
#each_permutation(size : Int = self.size, &block)
Yields each possible permutation of size of
self
. - #each_repeated_combination(size : Int = self.size, &block)
- #each_repeated_combination(size : Int = self.size)
- #each_repeated_permutation(size : Int = self.size, &block)
-
#empty?
Returns true if
self
is empty, false otherwise. -
#equals?(other : Array, &block)
Determines if
self
equals other according to a comparison done by the given block. -
#fill(value : T)
Replaces every element in
self
with the given value. -
#fill(value : T, range : Range(Int, Int))
Replaces every element in range with value.
-
#fill(range : Range(Int, Int), &block)
Yields each index of
self
, in the given range, to the given block and then assigns the block's value in that position. -
#fill(from : Int, &block)
Yields each index of
self
, starting at from, to the given block and then assigns the block's value in that position. -
#fill(from : Int, count : Int, &block)
Yields each index of
self
, starting at from and just count times, to the given block and then assigns the block's value in that position. -
#fill(value : T, from : Int)
Replaces every element in
self
, starting at from, with the given value. -
#fill(value : T, from : Int, count : Int)
Replaces every element in
self
, starting at from and only count times, with the given value. -
#fill(&block)
Yields each index of
self
to the given block and then assigns the block's value in that position. -
#first(n : Int)
Returns the first
n
elements of the array. -
#first(&block)
Returns the first element of
self
if it's not empty, or the given block's value. -
#first
Returns the first element of
self
if it's not empty, or raisesIndexError
. -
#first?
Returns the first element of
self
if it's not empty, ornil
. -
#flatten
Returns a new Array that is a one-dimensional flattening of self (recursively).
-
#hash
Returns a hash code based on
self
's size and elements. -
#insert(index : Int, object : T)
Insert object before the element at index and shifting successive elements, if any.
-
#last(&block)
Returns the last element of
self
if it's not empty, or the given block's value. -
#last(n : Int)
Returns the last
n
elements of the array. -
#last
Returns the last element of
self
if it's not empty, or raisesIndexError
. -
#last?
Returns the last element of
self
if it's not empty, ornil
. -
#map(&block : T -> U)
Optimized version of
Enumerable#map
. -
#map!(&block)
Invokes the given block for each element of
self
, replacing the element with the value returned by the block. -
#map_with_index(&block : T, Int32 -> U)
Optimized version of
Enumerable#map_with_index
. -
#permutations(size : Int = self.size)
Returns an Array with all possible permutations of size.
- #pop(&block)
-
#pop
Removes the last value from
self
, at index size - 1. -
#pop(n : Int)
Removes the last n values from
self
, at index size - 1. - #pop?
- #product(enumerable : Enumerable(U), &block)
- #product(ary : Array(U))
-
#push(*values : T)
Append multiple values.
-
#push(value : T)
Append.
-
#reject!(&block)
Modifies
self
, deleting the elements in the collection for which the passed block returns true. - #repeated_combinations(size : Int = self.size)
- #repeated_permutations(size : Int = self.size)
- #replace(other : Array)
-
#reverse
Returns an array with all the elements in the collection reversed.
-
#reverse!
Reverses in-place all the elements of
self
. -
#reverse_each(&block)
Calls the given block once for each element in
self
in reverse order, passing that element as a parameter. - #reverse_each
- #rindex(value)
- #rindex(&block)
- #rotate(n = 1)
- #rotate!(n = 1)
-
#sample(n : Int, random = Random::DEFAULT)
Returns n number of random elements from
self
, using the given random number generator. -
#sample(random = Random::DEFAULT)
Returns a random element from
self
, using the given random number generator. -
#select!(&block)
Modifies
self
, keeping only the elements in the collection for which the passed block returns true. - #shift(&block)
-
#shift
Removes the first value of
self
, at index 0. -
#shift(n : Int)
Removes the first n values of
self
, starting at index 0. - #shift?
-
#shuffle(random = Random::DEFAULT)
Returns an array with all the elements in the collection randomized using the given random number generator.
-
#shuffle!(random = Random::DEFAULT)
Modifies
self
by randomizing the order of elements in the collection using the given random number generator. -
#size
Returns the number of elements in the array.
- #sort(&block : T, T -> Int32)
-
#sort
Returns an array with all elements in the collection sorted.
-
#sort!
Modifies
self
by sorting the elements in the collection. - #sort!(&block : T, T -> Int32)
- #sort_by(&block : T -> _)
- #sort_by!(&block : T -> _)
- #swap(index0, index1)
- #to_a
- #to_json(io)
- #to_s(io : IO)
-
#to_unsafe : Pointer(T)
Returns a pointer to the internal buffer where
self
's elements are stored. - #to_yaml(yaml : YAML::Generator)
-
#transpose
Assumes that
self
is an array of arrays and transposes the rows and columns. -
#uniq(&block : T -> _)
Returns a new Array by removing duplicate values in
self
, using the block's value for comparison. -
#uniq
Returns a new Array by removing duplicate values in
self
. -
#uniq!(&block)
Removes duplicate elements from
self
, using the block's value for comparison. -
#uniq!
Removes duplicate elements from
self
. -
#unshift(*values : T)
Prepend multiple values.
-
#unshift(obj : T)
Prepend.
- #update(index : Int, &block)
-
#values_at(*indexes : Int)
Returns a tuple populated with the elements at the given indexes.
- #zip(other : Array(U))
- #zip(other : Array, &block)
- #zip?(other : Array(U))
- #zip?(other : Array, &block)
-
#|(other : Array(U))
Set union: returns a new Array by joining
self
with other, excluding any duplicates, and preserving the order fromself
.
Instance methods inherited from module Comparable(T)
<(other : T)
<,
<=(other : T)
<=,
<=>(other : T)
<=>,
==(other : T)
==,
>(other : T)
>,
>=(other : T)
>=
Instance methods inherited from module Iterable
cyclecycle(n) cycle, each each, each_cons(count : Int) each_cons, each_slice(count : Int) each_slice, each_with_index(offset = 0) each_with_index, each_with_object(obj) each_with_object
Instance methods inherited from module Enumerable(T)
all?all?(&block) all?, any?
any?(&block) any?, compact_map(&block) compact_map, count(item)
count(&block) count, cycle(&block)
cycle(n, &block) cycle, each(&block : T -> _) each, each_cons(count : Int, &block) each_cons, each_slice(count : Int, &block) each_slice, each_with_index(offset = 0, &block) each_with_index, each_with_object(obj, &block) each_with_object, find(if_none = nil, &block) find, first
first(count : Int) first, first? first?, flat_map(&block : T -> Array(U)) flat_map, grep(pattern) grep, group_by(&block : T -> U) group_by, in_groups_of(size : Int, filled_up_with : U = nil, &block)
in_groups_of(size : Int, filled_up_with : U = nil) in_groups_of, includes?(obj) includes?, index(obj)
index(&block) index, index_by(&block : T -> U) index_by, join(separator = "")
join(separator, io, &block)
join(separator = "", &block)
join(separator, io) join, map(&block : T -> U) map, map_with_index(&block : T, Int32 -> U) map_with_index, max max, max? max?, max_by(&block : T -> U) max_by, max_by?(&block : T -> U) max_by?, max_of(&block : T -> U) max_of, max_of?(&block : T -> U) max_of?, min min, min? min?, min_by(&block : T -> U) min_by, min_by?(&block : T -> U) min_by?, min_of(&block : T -> U) min_of, min_of?(&block : T -> U) min_of?, minmax minmax, minmax? minmax?, minmax_by(&block : T -> U) minmax_by, minmax_by?(&block : T -> U) minmax_by?, minmax_of(&block : T -> U) minmax_of, minmax_of?(&block : T -> U) minmax_of?, none?(&block)
none? none?, one?(&block) one?, partition(&block) partition, product(initial : Number, &block)
product
product(initial : Number)
product(&block) product, reduce(memo, &block)
reduce(&block) reduce, reject(&block : T -> ) reject, select(&block : T -> ) select, size size, skip(count : Int) skip, skip_while(&block) skip_while, sum
sum(initial)
sum(&block)
sum(initial, &block) sum, take_while(&block) take_while, to_a to_a, to_h to_h, to_set to_set
Instance methods inherited from class Reference
==(other)==(other : self) ==, hash hash, inspect(io : IO) : Nil inspect, object_id : UInt64 object_id, same?(other : Reference)
same?(other : Nil) same?, to_s(io : IO) : Nil to_s
Instance methods inherited from class Object
!=(other)
!=,
!~(other)
!~,
==(other)
==,
===(other)===(other : YAML::Any)
===(other : JSON::Any) ===, =~(other) =~, class class, clone clone, crystal_type_id crystal_type_id, dup dup, hash hash, inspect
inspect(io : IO) inspect, itself itself, not_nil! not_nil!, tap(&block) tap, to_json to_json, to_pretty_json(io : IO)
to_pretty_json to_pretty_json, to_s
to_s(io : IO) to_s, to_yaml(io : IO)
to_yaml to_yaml, try(&block) try
Class methods inherited from class Object
==(other : Class)
==,
===(other)
===,
cast(other) : self
cast,
from_json(string_or_io) : self
from_json,
from_yaml(string : String) : self
from_yaml,
hash
hash,
inspect(io)
inspect,
name : String
name,
to_s(io)
to_s,
|(other : U.class)
|
Class Method Detail
Creates a new Array, allocating an internal buffer with the given capacity, and yielding that buffer. The given block must return the desired size of the array.
This method is unsafe, but is usually used to initialize the buffer by passing it to a C function.
Array.build(3) do |buffer|
LibSome.fill_buffer_and_return_number_of_elements_filled(buffer)
end
Parses a String or IO denoting a JSON array, yielding each of its elements to the given block. This is useful for decoding an array and processing its elements without creating an Array in memory, which might be expensive.
require "json"
Array(Int32).from_json("[1, 2, 3]") do |element|
puts element
end
Output:
1
2
3
To parse and get an Array, use the block-less overload.
Creates a new Array of the given size and invokes the given block once for each index of self
,
assigning the block's value in that index.
Array.new(3) { |i| (i + 1) ** 2 } # => [1, 4, 9]
ary = Array.new(3) { [1] }
puts ary # => [[1], [1], [1]]
ary[0][0] = 2
puts ary # => [[2], [1], [1]]
Creates a new Array of the given size filled with the same value in each position.
Array.new(3, 'a') # => ['a', 'a', 'a']
ary = Array.new(3, [1])
puts ary # => [[1], [1], [1]]
ary[0][0] = 2
puts ary # => [[2], [2], [2]]
Creates a new empty Array backed by a buffer that is initially
initial_capacity
big.
The initial_capacity is useful to avoid unnecessary reallocations of the internal buffer in case of growth. If you have an estimate of the maximum number of elements an array will hold, the array should be initialized with that capacity for improved performance.
ary = Array(Int32).new(5)
ary.size # => 0
Instance Method Detail
Set intersection: returns a new Array containing elements common to self
and other, excluding any duplicates. The order is preserved from self
.
[1, 1, 3, 5] & [1, 2, 3] # => [ 1, 3 ]
['a', 'b', 'b', 'z'] & ['a', 'b', 'c'] # => [ 'a', 'b' ]
See also: #uniq
.
Repetition: Returns a new Array built by concatenating times copies of self
.
["a", "b", "c"] * 2 # => [ "a", "b", "c", "a", "b", "c" ]
Concatenation. Returns a new Array built by concatenating self
and other.
The type of the new array is the union of the types of both the original arrays.
[1, 2] + ["a"] # => [1,2,"a"] of (Int32 | String)
[1, 2] + [2, 3] # => [1,2,2,3]
Difference. Returns a new Array that is a copy of self
, removing any items
that appear in other. The order of self
is preserved.
[1, 2, 3] - [2, 1] # => [3]
Combined comparison operator. Returns 0 if self
equals other, 1 if
self
is greater than other and -1 if self
is smaller than other.
It compares the elements of both arrays in the same position using the
#<=>
operator. As soon as one of such comparisons returns a non-zero
value, that result is the return value of the comparison.
If all elements are equal, the comparison is based on the size of the arrays.
[8] <=> [1, 2, 3] # => 1
[2] <=> [4, 2, 3] # => -1
[1, 2] <=> [1, 2] # => 0
Equality. Returns true if each element in self
is equal to each
corresponding element in other.
ary = [1, 2, 3]
ary == [1, 2, 3] # => true
ary == [2, 3] # => false
Returns the element at the given index.
Negative indices can be used to start counting from the end of the array.
Raises IndexError
if trying to access an element outside the array's range.
ary = ['a', 'b', 'c']
ary[0] # => 'a'
ary[2] # => 'c'
ary[-1] # => 'c'
ary[-2] # => 'b'
ary[3] # raises IndexError
ary[-4] # raises IndexError
Returns all elements that are within the given range.
Negative indices count backward from the end of the array (-1 is the last element). Additionally, an empty array is returned when the starting index for an element range is at the end of the array.
Raises IndexError
if the starting index is out of range.
a = ["a", "b", "c", "d", "e"]
a[1..3] # => ["b", "c", "d"]
a[4..7] # => ["e"]
a[6..10] # => Index Error
a[5..10] # => []
a[-2...-1] # => ["d"]
Returns count or less (if there aren't enough) elements starting at the given start index.
Negative indices count backward from the end of the array (-1 is the last element). Additionally, an empty array is returned when the starting index for an element range is at the end of the array.
Raises IndexError
if the starting index is out of range.
a = ["a", "b", "c", "d", "e"]
a[-3, 3] # => ["c", "d", "e"]
a[6, 1] # => Index Error
a[1, 2] # => ["b", "c"]
a[5, 1] # => []
Sets the given value at the given index.
Negative indices can be used to start counting from the end of the array.
Raises IndexError
if trying to set an element outside the array's range.
ary = [1, 2, 3]
ary[0] = 5
p ary # => [5,2,3]
ary[3] = 5 # => IndexError
Replaces a subrange with the elements of the given array.
a = [1, 2, 3, 4, 5]
a[1, 3] = [6, 7, 8]
a # => [1, 6, 7, 8, 5]
a = [1, 2, 3, 4, 5]
a[1, 3] = [6, 7]
a # => [1, 6, 7, 5]
a = [1, 2, 3, 4, 5]
a[1, 3] = [6, 7, 8, 9, 10]
a # => [1, 6, 7, 8, 9, 10, 5]
Replaces a subrange with the elements of the given array.
a = [1, 2, 3, 4, 5]
a[1..3] = [6, 7, 8]
a # => [1, 6, 7, 8, 5]
a = [1, 2, 3, 4, 5]
a[1..3] = [6, 7]
a # => [1, 6, 7, 5]
a = [1, 2, 3, 4, 5]
a[1..3] = [6, 7, 8, 9, 10]
a # => [1, 6, 7, 8, 9, 10, 5]
Replaces a subrange with a single value.
a = [1, 2, 3, 4, 5]
a[1..3] = 6
a # => [1, 6, 5]
a = [1, 2, 3, 4, 5]
a[1...1] = 6
a # => [1, 6, 2, 3, 4, 5]
Replaces a subrange with a single value. All elements in the range
index...index+count
are removed and replaced by a single element
value.
If count is zero, value is inserted at index.
Negative values of index count from the end of the array.
a = [1, 2, 3, 4, 5]
a[1, 3] = 6
a # => [1, 6, 5]
a = [1, 2, 3, 4, 5]
a[1, 0] = 6
a # => [1, 6, 2, 3, 4, 5]
Returns the element at the given index.
Negative indices can be used to start counting from the end of the array.
Returns nil
if trying to access an element outside the array's range.
ary = ['a', 'b', 'c']
ary[0]? # => 'a'
ary[2]? # => 'c'
ary[-1]? # => 'c'
ary[-2]? # => 'b'
ary[3]? # nil
ary[-4]? # nil
Returns the element at the given index, if in bounds, otherwise executes the given block and returns its value.
a = [:foo, :bar]
a.at(0) { :baz } # => :foo
a.at(2) { :baz } # => :baz
Returns the element at the given index, if in bounds,
otherwise raises IndexError
.
a = [:foo, :bar]
a.at(0) # => :foo
a.at(2) # => IndexError
By using binary search, returns the first element
for which the passed block returns true
.
If the block returns false
, the finding element exists
behind. If the block returns true
, the finding element
is itself or exists infront.
Binary search needs sorted array, so self has to be sorted.
Returns nil
if the block didn't return true
for any element.
[2, 5, 7, 10].bsearch { |x| x >= 4 } # => 5
[2, 5, 7, 10].bsearch { |x| x > 10 } # => nil
By using binary search, returns the index of the first element
for which the passed block returns true
.
If the block returns false
, the finding element exists
behind. If the block returns true
, the finding element
is itself or exists infront.
Binary search needs sorted array, so self has to be sorted.
Returns nil
if the block didn't return true
for any element.
[2, 5, 7, 10].bsearch_index { |x, i| x >= 4 } # => 1
[2, 5, 7, 10].bsearch_index { |x, i| x > 10 } # => nil
Returns a new Array that has self
's elements cloned.
That is, it returns a deep copy of self
.
Use #dup
if you want a shallow copy.
ary = [[1, 2], [3, 4]]
ary2 = ary.clone
ary[0][0] = 5
puts ary # => [[5, 2], [3, 4]]
puts ary2 # => [[1, 2], [3, 4]]
ary2 << [7, 8]
puts ary # => [[5, 2], [3, 4]]
puts ary2 # => [[1, 2], [3, 4], [7, 8]]
Returns a copy of self with all nil
elements removed.
["a", nil, "b", nil, "c", nil].compact # => ["a", "b", "c"]
Removes all nil
elements from self
.
ary = ["a", nil, "b", nil, "c"]
ary.compact!
ary # => ["a", "b", "c"]
Appends the elements of other to self
, and returns self
.
ary = ["a", "b"]
ary.concat(["c", "d"])
ary # => ["a", "b", "c", "d"]
Appends the elements of other to self
, and returns self
.
ary = ["a", "b"]
ary.concat(["c", "d"])
ary # => ["a", "b", "c", "d"]
Removes all items from self
that are equal to obj.
a = ["a", "b", "b", "b", "c"]
a.delete("b")
a # => ["a", "c"]
Removes count elements from self
starting at index.
If the size of self
is less than count, removes values to the end of the array without error.
Returns an array of the removed elements with the original order of self
preserved.
Raises IndexError
if index is out of range.
a = ["ant", "bat", "cat", "dog"]
a.delete_at(1, 2) # => ["bat", "cat"]
a # => ["ant", "dog"]
a.delete_at(99, 1) # => IndexError
Removes the element at index, returning that element.
Raises IndexError
if index is out of range.
a = ["ant", "bat", "cat", "dog"]
a.delete_at(2) # => "cat"
a # => ["ant", "bat", "dog"]
a.delete_at(99) # => IndexError
Removes all elements within the given range.
Returns an array of the removed elements with the original order of self
preserved.
Raises IndexError
if the index is out of range.
a = ["ant", "bat", "cat", "dog"]
a.delete_at(1..2) # => ["bat", "cat"]
a # => ["ant", "dog"]
a.delete_at(99..100) # => IndexError
Returns a new Array that has exactly self
's elements.
That is, it returns a shallow copy of self
.
Use #clone
if you want a deep copy.
ary = [[1, 2], [3, 4]]
ary2 = ary.dup
ary[0][0] = 5
puts ary # => [[5, 2], [3, 4]]
puts ary2 # => [[5, 2], [3, 4]]
ary2 << [7, 8]
puts ary # => [[5, 2], [3, 4]]
puts ary2 # => [[5, 2], [3, 4], [7, 8]]
Calls the given block once for each element in self
, passing that
element as a parameter.
a = ["a", "b", "c"]
a.each { |x| print x, " -- " }
produces:
a -- b -- c --
Returns an Iterator
for the elements of self
.
a = ["a", "b", "c"]
iter = a.each
iter.next # => "a"
iter.next # => "b"
The returned iterator keeps a reference to self
: if the array
changes, the returned values of the iterator change as well.
Returns an Iterator
for each index in self
.
a = ["a", "b", "c"]
iter = a.each_index
iter.next # => 0
iter.next # => 1
The returned iterator keeps a reference to self
. If the array
changes, the returned values of the iterator will change as well.
Calls the given block once for each index in self
, passing that
index as a parameter.
a = ["a", "b", "c"]
a.each_index { |x| print x, " -- " }
produces:
0 -- 1 -- 2 --
Returns an Iterator
over each possible permutation of size of self
.
iter = [1, 2, 3].each_permutation
iter.next # => [1, 2, 3]
iter.next # => [1, 3, 2]
iter.next # => [2, 1, 3]
iter.next # => [2, 3, 1]
iter.next # => [3, 1, 2]
iter.next # => [3, 2, 1]
iter.next # => Iterator::Stop
Yields each possible permutation of size of self
.
a = [1, 2, 3]
sums = [] of Int32
a.each_permutation(2) { |p| sums << p.sum } #=> [1, 2, 3]
sums #=> [3, 4, 3, 5, 4, 5]
Returns true if self
is empty, false otherwise.
([] of Int32).empty? # => true
([1]).empty? # => false
Determines if self
equals other according to a comparison
done by the given block.
If self
's size is the same as other's size, this method yields
elements from self
and other in tandem: if the block returns true
for all of them, this method returns true. Otherwise it returns false.
a = [1, 2, 3]
b = ["a", "ab", "abc"]
a.equals?(b) { |x, y| x == y.size } # => true
a.equals?(b) { |x, y| x == y } # => false
Replaces every element in self
with the given value. Returns self
.
a = [1, 2, 3]
a.fill(9) # => [9, 9, 9]
Replaces every element in range with value. Returns self
.
Negative values of from count from the end of the array.
a = [1, 2, 3, 4, 5]
a.fill(9, 2..3) # => [1, 2, 9, 9, 5]
Yields each index of self
, in the given range, to the given block and then assigns
the block's value in that position. Returns self
.
a = [1, 2, 3, 4, 5, 6]
a.fill(2..3) { |i| i * i } # => [1, 2, 4, 9, 5, 6]
Yields each index of self
, starting at from, to the given block and then assigns
the block's value in that position. Returns self
.
Negative values of from count from the end of the array.
a = [1, 2, 3, 4]
a.fill(2) { |i| i * i } # => [1, 2, 4, 9]
Yields each index of self
, starting at from and just count times,
to the given block and then assigns the block's value in that position. Returns self
.
Negative values of from count from the end of the array.
a = [1, 2, 3, 4, 5, 6]
a.fill(2, 2) { |i| i * i } # => [1, 2, 4, 9, 5, 6]
Replaces every element in self
, starting at from, with the given value. Returns self
.
Negative values of from count from the end of the array.
a = [1, 2, 3, 4, 5]
a.fill(9, 2) # => [1, 2, 9, 9, 9]
Replaces every element in self
, starting at from and only count times,
with the given value. Returns self
.
Negative values of from count from the end of the array.
a = [1, 2, 3, 4, 5]
a.fill(9, 2, 2) # => [1, 2, 9, 9, 5]
Yields each index of self
to the given block and then assigns
the block's value in that position. Returns self
.
a = [1, 2, 3, 4]
a.fill { |i| i * i } # => [0, 1, 4, 9]
Returns the first n
elements of the array.
[1, 2, 3].first(2) # => [1, 2]
[1, 2, 3].first(4) # => [1, 2, 3]
Returns the first element of self
if it's not empty, or the given block's value.
([1, 2, 3]).first { 4 } # => 1
([] of Int32).first { 4 } # => 4
Returns the first element of self
if it's not empty, or raises IndexError
.
([1, 2, 3]).first # => 1
([] of Int32).first # => raises IndexError
Returns the first element of self
if it's not empty, or nil
.
([1, 2, 3]).first? # => 1
([] of Int32).first? # => nil
Returns a new Array that is a one-dimensional flattening of self (recursively).
That is, for every element that is an array, extract its elements into the new array.
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]
Insert object before the element at index and shifting successive elements, if any.
Returns self
.
Negative values of index count from the end of the array.
a = ["a", "b", "c"]
a.insert(0, "x") # => ["x", "a", "b", "c"]
a.insert(2, "y") # => ["x", "a", "y", "b", "c"]
a.insert(-1, "z") # => ["x", "a", "y", "b", "c", "z"]
Returns the last element of self
if it's not empty, or the given block's value.
([1, 2, 3]).last { 4 } # => 3
([] of Int32).last { 4 } # => 4
Returns the last n
elements of the array.
[1, 2, 3].last(2) # => [2, 3]
[1, 2, 3].last(4) # => [1, 2, 3]
Returns the last element of self
if it's not empty, or raises IndexError
.
([1, 2, 3]).last # => 3
([] of Int32).last # => raises IndexError
Returns the last element of self
if it's not empty, or nil
.
([1, 2, 3]).last? # => 1
([] of Int32).last? # => nil
Invokes the given block for each element of self
, replacing the element
with the value returned by the block. Returns self
.
a = [1, 2, 3]
a.map! { |x| x * x }
a # => [1, 4, 9]
Optimized version of Enumerable#map_with_index
.
Returns an Array with all possible permutations of size.
a = [1, 2, 3]
a.permutations #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
a.permutations(1) #=> [[1],[2],[3]]
a.permutations(2) #=> [[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]]
a.permutations(3) #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
a.permutations(0) #=> [[]]
a.permutations(4) #=> []
Removes the last value from self
, at index size - 1.
This method returns the removed value.
Raises IndexError
if array is of 0 size.
a = ["a", "b", "c"]
a.pop # => "c"
a # => ["a", "b"]
Removes the last n values from self
, at index size - 1.
This method returns an array of the removed values, with the original order preserved.
If n is greater than the size of self
, all values will be removed from self
without raising an error.
a = ["a", "b", "c"]
a.pop(2) # => ["b", "c"]
a # => ["a"]
a = ["a", "b", "c"]
a.pop(4) # => ["a", "b", "c"]
a # => []
Append multiple values. The same as #push
, but takes an arbitrary number
of values to push into self
. Returns self
.
a = ["a"]
a.push(["b", "c"]) # => ["a", "b", "c"]
Append. Pushes one value to the end of self
, given that the type of the value is T
(which might be a single type or a union of types).
This method returns self
, so several calls can be chained. See #pop
for the opposite effect.
a = ["a", "b"]
a.push("c") # => ["a", "b", "c"]
a.push(1) # => Errors, because the array only accepts String.
a = ["a", "b"] of (Int32 | String)
a.push("c") # => ["a", "b", "c"]
a.push(1) # => ["a", "b", "c", 1]
Modifies self
, deleting the elements in the collection for which the
passed block returns true. Returns nil
if no changes were made.
See also Array#reject
Returns an array with all the elements in the collection reversed.
a = [1, 2, 3]
a.reverse # => [3, 2, 1]
Calls the given block once for each element in self
in reverse order,
passing that element as a parameter.
a = ["a", "b", "c"]
a.reverse_each { |x| print x, " -- " }
produces:
c -- b -- a --
Returns n number of random elements from self
, using the given random number generator.
Raises IndexError if self
is empty.
a = [1, 2, 3]
a.sample(2) # => [2, 1]
a.sample(2, Random.new(1)) # => [1, 3]
Returns a random element from self
, using the given random number generator.
Raises IndexError if self
is empty.
a = [1, 2, 3]
a.sample # => 2
a.sample # => 1
a.sample(Random.new(1)) # => 3
Modifies self
, keeping only the elements in the collection for which the
passed block returns true. Returns nil
if no changes were made.
See also Array#select
Removes the first value of self
, at index 0. This method returns the removed value.
Raises IndexError
if array is of 0 size.
a = ["a", "b", "c"]
a.shift # => "a"
a # => ["b", "c"]
Removes the first n values of self
, starting at index 0.
This method returns an array of the removed values.
If n is greater than the size of self
, all values will be removed from self
without raising an error.
a = ["a", "b", "c"]
a.shift # => "a"
a # => ["b", "c"]
a = ["a", "b", "c"]
a.shift(4) # => ["a", "b", "c"]
a # => []
Returns an array with all the elements in the collection randomized using the given random number generator.
Modifies self
by randomizing the order of elements in the collection
using the given random number generator. Returns self
.
Returns an array with all elements in the collection sorted.
a = [3, 1, 2]
a.sort # => [1, 2, 3]
a # => [3, 1, 2]
Optionally, a block may be given that must implement a comparison, either with the comparison operator #<=>
or a comparison between a and b, where a < b yields -1, a == b yields 0, and a > b yields 1.
Modifies self
by sorting the elements in the collection.
a = [3, 1, 2]
a.sort!
a # => [1, 2, 3]
Optionally, a block may be given that must implement a comparison, either with the comparison operator #<=>
or a comparison between a and b, where a < b yields -1, a == b yields 0, and a > b yields 1.
Returns a pointer to the internal buffer where self
's elements are stored.
This method is unsafe because it returns a pointer, and the pointed might eventually
not be that of self
if the array grows and its internal buffer is reallocated.
ary = [1, 2, 3]
ary.to_unsafe[0] # => 1
Assumes that self
is an array of arrays and transposes the rows and columns.
a = [[:a, :b], [:c, :d], [:e, :f]]
a.transpose # => [[:a, :c, :e], [:b, :d, :f]]
a # => [[:a, :b], [:c, :d], [:e, :f]]
Returns a new Array by removing duplicate values in self
, using the block's
value for comparison.
a = [{"student", "sam"}, {"student", "george"}, {"teacher", "matz"}]
a.uniq { |s| s[0] } # => [{"student", "sam"}, {"teacher", "matz"}]
a # => [{"student", "sam"}, {"student", "george"}, {"teacher", "matz"}]
Returns a new Array by removing duplicate values in self
.
a = ["a", "a", "b", "b", "c"]
a.uniq # => ["a", "b", "c"]
a # => [ "a", "a", "b", "b", "c" ]
Removes duplicate elements from self
, using the block's value for comparison. Returns self
.
a = [{"student", "sam"}, {"student", "george"}, {"teacher", "matz"}]
a.uniq! { |s| s[0] } # => [{"student", "sam"}, {"teacher", "matz"}]
a # => [{"student", "sam"}, {"teacher", "matz"}]
Removes duplicate elements from self
. Returns self
.
a = ["a", "a", "b", "b", "c"]
a.uniq! # => ["a", "b", "c"]
a # => ["a", "b", "c"]
Prepend multiple values. The same as #unshift
, but takes an arbitrary number
of values to add to the array. Returns self
.
Prepend. Adds obj to the beginning of self
, given that the type of the value is T
(which might be a single type or a union of types).
This method returns self
, so several calls can be chained. See #shift
for the opposite effect.
a = ["a", "b"]
a.unshift("c") # => ["c", a", "b"]
a.unshift(1) # => Errors, because the array only accepts String.
a = ["a", "b"] of (Int32 | String)
a.unshift("c") # => ["c", "a", "b"]
a.unshift(1) # => [1, "a", "b", "c"]
Returns a tuple populated with the elements at the given indexes.
Raises IndexError
if any index is invalid.
["a", "b", "c", "d"].values_at(0, 2) # => {"a", "c"}
Set union: returns a new Array by joining self
with other, excluding
any duplicates, and preserving the order from self
.
["a", "b", "c"] | ["c", "d", "a"] # => [ "a", "b", "c", "d" ]
See also: #uniq
.