On this page
- Array Indexes
- In-Range and Out-of-Range Indexes
- Effective Index
- Creating Arrays
- Example Usage
- Accessing Elements
- Obtaining Information about an Array
- Adding Items to an Array
- Removing Items from an Array
- Iterating over an Array
- Selecting Items from an Array
- Non-destructive Selection
- Destructive Selection
- What’s Here
- Methods for Creating an Array
- Methods for Querying
- Methods for Comparing
- Methods for Fetching
- Methods for Assigning
- Methods for Deleting
- Methods for Combining
- Methods for Iterating
- Methods for Converting
- Other Methods
- Class methods
- Instance methods
- Ruby version changes
Array
An Array object is an ordered, integer-indexed collection of objects, called elements; the object represents an array data structure.
An element may be any object (even another array); elements may be any mixture of objects of different types.
Important data structures that use arrays include:
There are also array-like data structures:
-
Associative array (see
Hash). -
Environment (see
ENV). -
Set (see Set).
Array Indexes
Array indexing starts at 0, as in C or Java.
A non-negative index is an offset from the first element:
-
Index 0 indicates the first element.
-
Index 1 indicates the second element.
-
…
A negative index is an offset, backwards, from the end of the array:
-
Index -1 indicates the last element.
-
Index -2 indicates the next-to-last element.
-
…
In-Range and Out-of-Range Indexes
A non-negative index is in range if and only if it is smaller than the size of the array. For a 3-element array:
-
Indexes 0 through 2 are in range.
-
Index 3 is out of range.
A negative index is in range if and only if its absolute value is not larger than the size of the array. For a 3-element array:
-
Indexes -1 through -3 are in range.
-
Index -4 is out of range.
Effective Index
Although the effective index into an array is always an integer, some methods (both within class Array and elsewhere) accept one or more non-integer arguments that are integer-convertible objects.
Creating Arrays
You can create an Array object explicitly with:
-
An array literal:
Example[1, 'one', :one, [2, 'two', :two]]
-
A %w or %W string-array Literal:
Example%w[foo bar baz] # => ["foo", "bar", "baz"] %w[1 % *] # => ["1", "%", "*"]
-
A %i or %I symbol-array Literal:
Example%i[foo bar baz] # => [:foo, :bar, :baz] %i[1 % *] # => [:"1", :%, :*]
-
Method
Kernel#Array:ExampleArray(["a", "b"]) # => ["a", "b"] Array(1..5) # => [1, 2, 3, 4, 5] Array(key: :value) # => [[:key, :value]] Array(nil) # => [] Array(1) # => [1] Array({:a => "a", :b => "b"}) # => [[:a, "a"], [:b, "b"]]
-
Method
Array.new:ExampleArray.new # => [] Array.new(3) # => [nil, nil, nil] Array.new(4) {Hash.new} # => [{}, {}, {}, {}] Array.new(3, true) # => [true, true, true]
Note that the last example above populates the array with references to the same object. This is recommended only in cases where that object is a natively immutable object such as a symbol, a numeric,
nil,true, orfalse.Another way to create an array with various objects, using a block; this usage is safe for mutable objects such as hashes, strings or other arrays:
ExampleArray.new(4) {|i| i.to_s } # => ["0", "1", "2", "3"]
Here is a way to create a multi-dimensional array:
ExampleArray.new(3) {Array.new(3)} # => [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
A number of Ruby methods, both in the core and in the standard library, provide instance method to_a, which converts an object to an array.
-
Benchmark::Tms#to_a
-
CSV::Table#to_a
-
Gem::List#to_a
-
Racc::ISet#to_a
-
Rinda::RingFinger#to_a
-
Ripper::Lexer::Elem#to_a
Example Usage
In addition to the methods it mixes in through the Enumerable module, class Array has proprietary methods for accessing, searching and otherwise manipulating arrays.
Some of the more common ones are illustrated below.
Accessing Elements
Elements in an array can be retrieved using the Array#[] method. It can take a single integer argument (a numeric index), a pair of arguments (start and length) or a range. Negative indices start counting from the end, with -1 being the last element.
arr = [1, 2, 3, 4, 5, 6] arr[2] #=> 3 arr[100] #=> nil arr[-3] #=> 4 arr[2, 3] #=> [3, 4, 5] arr[1..4] #=> [2, 3, 4, 5] arr[1..-3] #=> [2, 3, 4]
Another way to access a particular array element is by using the at method
arr.at(0) #=> 1
The slice method works in an identical manner to Array#[].
To raise an error for indices outside of the array bounds or else to provide a default value when that happens, you can use fetch.
arr = ['a', 'b', 'c', 'd', 'e', 'f'] arr.fetch(100) #=> IndexError: index 100 outside of array bounds: -6...6 arr.fetch(100, "oops") #=> "oops"
The special methods first and last will return the first and last elements of an array, respectively.
arr.first #=> 1 arr.last #=> 6
To return the first n elements of an array, use take
arr.take(3) #=> [1, 2, 3]
drop does the opposite of take, by returning the elements after n elements have been dropped:
arr.drop(3) #=> [4, 5, 6]
Obtaining Information about an Array
An array keeps track of its own length at all times. To query an array about the number of elements it contains, use length, count or size.
browsers = ['Chrome', 'Firefox', 'Safari', 'Opera', 'IE'] browsers.length #=> 5 browsers.count #=> 5
To check whether an array contains any elements at all
browsers.empty? #=> false
To check whether a particular item is included in the array
browsers.include?('Konqueror') #=> false
Adding Items to an Array
Items can be added to the end of an array by using either push or <<
arr = [1, 2, 3, 4] arr.push(5) #=> [1, 2, 3, 4, 5] arr << 6 #=> [1, 2, 3, 4, 5, 6]
unshift will add a new item to the beginning of an array.
arr.unshift(0) #=> [0, 1, 2, 3, 4, 5, 6]
With insert you can add a new element to an array at any position.
arr.insert(3, 'apple') #=> [0, 1, 2, 'apple', 3, 4, 5, 6]
Using the insert method, you can also insert multiple values at once:
arr.insert(3, 'orange', 'pear', 'grapefruit') #=> [0, 1, 2, "orange", "pear", "grapefruit", "apple", 3, 4, 5, 6]
Removing Items from an Array
The method pop removes the last element in an array and returns it:
arr = [1, 2, 3, 4, 5, 6] arr.pop #=> 6 arr #=> [1, 2, 3, 4, 5]
To retrieve and at the same time remove the first item, use shift:
arr.shift #=> 1 arr #=> [2, 3, 4, 5]
To delete an element at a particular index:
arr.delete_at(2) #=> 4 arr #=> [2, 3, 5]
To delete a particular element anywhere in an array, use delete:
arr = [1, 2, 2, 3] arr.delete(2) #=> 2 arr #=> [1,3]
A useful method if you need to remove nil values from an array is compact:
arr = ['foo', 0, nil, 'bar', 7, 'baz', nil] arr.compact #=> ['foo', 0, 'bar', 7, 'baz'] arr #=> ['foo', 0, nil, 'bar', 7, 'baz', nil] arr.compact! #=> ['foo', 0, 'bar', 7, 'baz'] arr #=> ['foo', 0, 'bar', 7, 'baz']
Another common need is to remove duplicate elements from an array.
It has the non-destructive uniq, and destructive method uniq!
arr = [2, 5, 6, 556, 6, 6, 8, 9, 0, 123, 556] arr.uniq #=> [2, 5, 6, 556, 8, 9, 0, 123]
Iterating over an Array
Like all classes that include the Enumerable module, class Array has an each method, which defines what elements should be iterated over and how. In case of Array#each, all elements in self are yielded to the supplied block in sequence.
Note that this operation leaves the array unchanged.
arr = [1, 2, 3, 4, 5] arr.each {|a| print a -= 10, " "} # prints: -9 -8 -7 -6 -5 #=> [1, 2, 3, 4, 5]
Another sometimes useful iterator is reverse_each which will iterate over the elements in the array in reverse order.
words = %w[first second third fourth fifth sixth] str = "" words.reverse_each {|word| str += "#{word} "} p str #=> "sixth fifth fourth third second first "
The map method can be used to create a new array based on the original array, but with the values modified by the supplied block:
arr.map {|a| 2*a} #=> [2, 4, 6, 8, 10] arr #=> [1, 2, 3, 4, 5] arr.map! {|a| a**2} #=> [1, 4, 9, 16, 25] arr #=> [1, 4, 9, 16, 25]
Selecting Items from an Array
Elements can be selected from an array according to criteria defined in a block. The selection can happen in a destructive or a non-destructive manner. While the destructive operations will modify the array they were called on, the non-destructive methods usually return a new array with the selected elements, but leave the original array unchanged.
Non-destructive Selection
arr = [1, 2, 3, 4, 5, 6] arr.select {|a| a > 3} #=> [4, 5, 6] arr.reject {|a| a < 3} #=> [3, 4, 5, 6] arr.drop_while {|a| a < 4} #=> [4, 5, 6] arr #=> [1, 2, 3, 4, 5, 6]
Destructive Selection
select! and reject! are the corresponding destructive methods to select and reject
Similar to select vs. reject, delete_if and keep_if have the exact opposite result when supplied with the same block:
arr.delete_if {|a| a < 4} #=> [4, 5, 6] arr #=> [4, 5, 6] arr = [1, 2, 3, 4, 5, 6] arr.keep_if {|a| a < 4} #=> [1, 2, 3] arr #=> [1, 2, 3]
What’s Here
First, what’s elsewhere. Class Array:
-
Inherits from class Object.
-
Includes module Enumerable, which provides dozens of additional methods.
Here, class Array provides methods that are useful for:
Methods for Creating an Array
-
::[]: Returns a new array populated with given objects. -
::new: Returns a new array. -
::try_convert: Returns a new array created from a given object.
See also Creating Arrays.
Methods for Querying
-
all?: Returns whether all elements meet a given criterion. -
any?: Returns whether any element meets a given criterion. -
count: Returns the count of elements that meet a given criterion. -
empty?: Returns whether there are no elements. -
find_index(aliased asindex): Returns the index of the first element that meets a given criterion. -
hash: Returns the integer hash code. -
include?: Returns whether any element==a given object. -
none?: Returns whether no element==a given object. -
one?: Returns whether exactly one element==a given object. -
rindex: Returns the index of the last element that meets a given criterion.
Methods for Comparing
-
<=>: Returns -1, 0, or 1, asselfis less than, equal to, or greater than a given object. -
==: Returns whether each element inselfis==to the corresponding element in a given object. -
eql?: Returns whether each element inselfiseql?to the corresponding element in a given object.
Methods for Fetching
These methods do not modify self.
-
[](aliased asslice): Returns consecutive elements as determined by a given argument. -
assoc: Returns the first element that is an array whose first element==a given object. -
at: Returns the element at a given offset. -
bsearch: Returns an element selected via a binary search as determined by a given block. -
bsearch_index: Returns the index of an element selected via a binary search as determined by a given block. -
compact: Returns an array containing all non-nilelements. -
dig: Returns the object in nested objects that is specified by a given index and additional arguments. -
drop: Returns trailing elements as determined by a given index. -
drop_while: Returns trailing elements as determined by a given block. -
fetch: Returns the element at a given offset. -
fetch_values: Returns elements at given offsets. -
first: Returns one or more leading elements. -
last: Returns one or more trailing elements. -
max: Returns one or more maximum-valued elements, as determined by<=>or a given block. -
min: Returns one or more minimum-valued elements, as determined by<=>or a given block. -
minmax: Returns the minimum-valued and maximum-valued elements, as determined by<=>or a given block. -
rassoc: Returns the first element that is an array whose second element==a given object. -
reject: Returns an array containing elements not rejected by a given block. -
reverse: Returns all elements in reverse order. -
rotate: Returns all elements with some rotated from one end to the other. -
sample: Returns one or more random elements. -
select(aliased asfilter): Returns an array containing elements selected by a given block. -
shuffle: Returns elements in a random order. -
sort: Returns all elements in an order determined by<=>or a given block. -
take: Returns leading elements as determined by a given index. -
take_while: Returns leading elements as determined by a given block. -
uniq: Returns an array containing non-duplicate elements. -
values_at: Returns the elements at given offsets.
Methods for Assigning
These methods add, replace, or reorder elements in self.
-
<<: Appends an element. -
[]=: Assigns specified elements with a given object. -
concat: Appends all elements from given arrays. -
fill: Replaces specified elements with specified objects. -
flatten!: Replaces each nested array inselfwith the elements from that array. -
initialize_copy(aliased asreplace): Replaces the content ofselfwith the content of a given array. -
insert: Inserts given objects at a given offset; does not replace elements. -
reverse!: Replacesselfwith its elements reversed. -
rotate!: Replacesselfwith its elements rotated. -
shuffle!: Replacesselfwith its elements in random order. -
sort!: Replacesselfwith its elements sorted, as determined by<=>or a given block. -
sort_by!: Replacesselfwith its elements sorted, as determined by a given block.
Methods for Deleting
Each of these methods removes elements from self:
-
clear: Removes all elements. -
compact!: Removes allnilelements. -
delete: Removes elements equal to a given object. -
delete_at: Removes the element at a given offset. -
delete_if: Removes elements specified by a given block. -
keep_if: Removes elements not specified by a given block. -
pop: Removes and returns the last element. -
reject!: Removes elements specified by a given block. -
select!(aliased asfilter!): Removes elements not specified by a given block. -
shift: Removes and returns the first element. -
slice!: Removes and returns a sequence of elements. -
uniq!: Removes duplicates.
Methods for Combining
-
&: Returns an array containing elements found both inselfand a given array. -
+: Returns an array containing all elements ofselffollowed by all elements of a given array. -
-: Returns an array containing all elements ofselfthat are not found in a given array. -
|: Returns an array containing all element ofselfand all elements of a given array, duplicates removed. -
difference: Returns an array containing all elements ofselfthat are not found in any of the given arrays.. -
intersection: Returns an array containing elements found both inselfand in each given array. -
product: Returns or yields all combinations of elements fromselfand given arrays. -
reverse: Returns an array containing all elements ofselfin reverse order. -
union: Returns an array containing all elements ofselfand all elements of given arrays, duplicates removed.
Methods for Iterating
-
combination: Calls a given block with combinations of elements ofself; a combination does not use the same element more than once. -
cycle: Calls a given block with each element, then does so again, for a specified number of times, or forever. -
each: Passes each element to a given block. -
each_index: Passes each element index to a given block. -
permutation: Calls a given block with permutations of elements ofself; a permutation does not use the same element more than once. -
repeated_combination: Calls a given block with combinations of elements ofself; a combination may use the same element more than once. -
repeated_permutation: Calls a given block with permutations of elements ofself; a permutation may use the same element more than once. -
reverse_each: Passes each element, in reverse order, to a given block.
Methods for Converting
-
collect(aliased asmap): Returns an array containing the block return-value for each element. -
collect!(aliased asmap!): Replaces each element with a block return-value. -
flatten: Returns an array that is a recursive flattening ofself. -
inspect(aliased asto_s): Returns a newStringcontaining the elements. -
join: Returns a newStringcontaining the elements joined by the field separator. -
to_a: Returnsselfor a new array containing all elements. -
to_ary: Returnsself. -
to_h: Returns a new hash formed from the elements. -
transpose: Transposesself, which must be an array of arrays. -
zip: Returns a new array of arrays containingselfand given arrays.
Other Methods
-
*: Returns one of the following:-
With integer argument
n, a new array that is the concatenation ofncopies ofself. -
With string argument
field_separator, a new string that is equivalent tojoin(field_separator).
-
-
pack: Packs the elements into a binary sequence. -
sum: Returns a sum of elements according to either+or a given block.
Class methods 3
Instance methods 114
Ruby version changes 7
-
4.0
-
Array#rfindhas been added as a more efficient alternative toarray.reverse_each.find[Feature #21678] -
Array#findhas been added as a more efficient override ofEnumerable#find[Feature #21678]
-
-
3.4
-
Array#fetch_valueswas added. [Feature #20702]
-
-
3.3
-
Array#packnow raisesArgumentErrorfor unknown directives. [Bug #19150]
-
-
3.1
-
Array#intersect?is added. [Feature #15198]
-
-
3.0
-
The following methods now return
Arrayinstances instead of subclass instances when called on subclass instances: [Bug #6087] -
Can be sliced with
Enumerator::ArithmeticSequenceExampledirty_data = ['--', 'data1', '--', 'data2', '--', 'data3'] dirty_data[(1..).step(2)] # take each second element # => ["data1", "data2", "data3"]
-