Introduction
An array is a data structure that represents a list of values, called elements. Arrays let you store multiple values in a single variable. In Ruby, arrays can contain any data type, including numbers, strings, and other Ruby objects. This can condense and organize your code, making it more readable and maintainable. All arrays are objects with their own methods you can call, providing a standardized way to work with datasets.
In this tutorial, you’ll create arrays, access the values they contain, add, modify, and remove elements in an array, and iterate through the elements in an array to solve more complex problems.
Creating an Array
You’ll start by looking at how to create arrays in more detail. As an example, here is a list of various shark species. Without an array, you might store them in individual variables:
sharks.rb
shark1 = "Hammerhead"
shark2 = "Great White"
shark3 = "Tiger"
This approach is verbose and can quickly become difficult to maintain, as it’s not very flexible. Adding another shark means you’d have to add, and track, an additional variable.
If you use an array, you can simplify this data. To create an array in a Ruby program, use square brackets: ([]
), and separate the values you want to store with commas:
sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger"]
Instead of creating three separate variables, you now have one variable that contains all three sharks. In this example, you used square brackets — []
— to create an array, and separated each entry with a comma. If you had to add an additional shark, you would add another shark to the array rather than creating and managing a new variable.
You can print out an entire array with the print
statement, which will display the array’s contents:
print sharks
["Hammerhead", "Great White", "Tiger"]
If you want to create an array where each entry is a single word, you can use the %w{}
syntax, which creates a word array:
days = %w{Monday Tuesday Wednesday Thursday Friday Saturday Sunday}
This is equivalent to creating the array with square braces:
days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
However, notice that the %w{}
method lets you skip the quotes and the commas.
Arrays are often used to group together lists of similar data types, but in Ruby, arrays can contain any value or a mix of values. This includes other arrays. Here’s an example of an array that contains a string, a nil
value, an integer, and an array of strings:
mixed_data.rb
record = [
"Sammy",
null,
7,
[
"another",
"array",
]
]
Now you’ll look at how to access data stored in arrays.
Accessing Items in Arrays
To access a specific item, or element of an array, you reference its index, or its position in the array. In Ruby, indexes start at zero. In order to retrieve the first element from your sharks
array, you append the element’s index to the variable using square brackets:
sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger"]
The sharks
array has three elements. Here is a breakdown of how each element in the sharks
array is indexed.
Hammerhead
Great White
Tiger
1
2
The first element in the array is Hammerhead
, which is indexed at . The last element is `Tiger`, which is indexed at `2`. Counting starts with
in indices, which goes against the natural intuition to start counting at 1, so you’ll want to keep this in mind until it becomes natural.
Note: It might help you to think of the index as an offset, meaning the number of places from the start of the array. The first element is at the beginning, so its offset, or index, is ``. The second element is one spot away from the first entry in the array, so its offset, or index, is 1
.
You can find out how many elements are in an array with the length
method:
sharks.length
3
Although the indices of sharks
start at `` and go to 2
, the length
property returns the number of elements in the array, which is 3
. It’s not concerned with the indices at all.
If you wanted to find out the index number of a specific element in an array, such as Tiger
, use the index()
method:
print sharks.index("Tiger")
2
This returns the index of the first element containing that text. If an index number is not found, such as for a value that does not exist, the console will return nil
:
print sharks.index("Whale")
nil
To get the last element of an array in Ruby, use the index -1
:
print sharks[-1]
"Tiger"
Ruby also provides the first
and last
methods to get the first and last elements without using indices:
puts sharks.first
puts sharks.last
"Hammerhead"
"Tiger"
Attempting to access an index that doesn’t exist will return nil
:
sharks[10]
nil
Arrays can contain other arrays, which are called nested arrays. This is one way to model two-dimensional datasets in a program. Here’s an example of a nested array:
nested_array = [
[
"salmon",
"halibut",
],
[
"coral",
"reef",
]
]
In order to access elements in a nested array, you would add another index number to correspond to the inner array. For example, to retrieve the value coral
from this nested array, you’d use the following statement:
print nested_array[1][0];
coral
In this example, you accessed the array at position 1
of the nested_array
variable, which returned the array ["coral", "reef"]
. You then accessed the elements at position `` of that array, which was "coral"
.
Now you’ll look at how to add elements to an array.
Adding Elements to Arrays
You have three elements in your sharks
array, which are indexed from `` to 2
:
sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger"]
There are a few ways to add a new element. You could assign a value to the next index, which in this case would be 3
:
sharks[3] = "Whale";
print sharks
["Hammerhead", "Great White", "Tiger", "Whale"]
This method is error-prone though. If you add an element and accidentally skip an index, it will create a nil
element in the array.
sharks[5] = "Sand";
print sharks;
["Hammerhead", "Great White", "Tiger", "Whale", nil, "Sand"]
Attempting to access the extra array element will return its value, which will be nil
:
sharks[4]
nil
Finding the next available index in an array is error-prone and takes extra time. Avoid errors by using the push
method, which adds an element to the end of an array:
sharks.push("Thresher")
print sharks
["Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher"]
You can also use the <<
syntax instead of the push
method to add an element to the end of an array:
sharks << "Bullhead"
["Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", "Bullhead"]
To add an element to the beginning of an array, use the unshift()
method:
sharks.unshift("Angel")
print sharks
["Angel", "Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", "Bullhead"]
Now that you know how to add elements, you’ll look at removing them.
Removing Elements from Arrays
To remove a specific element from an array, use the delete
or delete_at
methods. In the sharks
array, you created a nil
array element earlier. Now, you’ll get rid of it.
First, find its position in the array. You can use the index
method to do that:
print sharks.index(nil)
4
Then use delete_at
to remove the element at index 4
and print the array:
sharks.delete_at(4)
print sharks
["Angel", "Hammerhead", "Great White", "Tiger", "Whale", "Thresher", "Bullhead"]
The delete
method removes elements from an array that match the value you pass in. Use it to remove Whale
from the array:
sharks.delete("Whale")
print sharks;
["Angel", "Hammerhead", "Great White", "Tiger", "Thresher", "Bullhead"]
The delete
method will remove all occurrences of the value you pass, so if your array has duplicate elements, they’ll all be removed.
The pop
method will remove the last element in an array:
sharks.pop
print sharks;
["Angel", "Hammerhead", "Great White", "Tiger", "Thresher"]
Bullhead
has been removed as the last element of the array. In order to remove the first element of the array, use the shift
method:
sharks.shift
print sharks
["Hammerhead", "Great White", "Tiger", "Thresher"]
This time, Angel
was removed from the beginning of the array.
By using pop
and shift
, you can remove elements from the beginning and the end of arrays. Using pop
is preferred wherever possible, as the rest of the items in the array retain their original index numbers.
The delete_at
, pop
, and shift
methods all change the original array and return the element you deleted::
sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
deleted_at_element = sharks.delete_at(1)
popped_element = sharks.pop
puts "Deleted_at element: #{deleted_at_element}"
puts "Popped element: #{popped_element}"
puts "Remaining array: #{sharks}"
Deleted_at element: Great White
Popped element: Whale
Remaining array: ["Hammerhead", "Tiger"]
You now know several ways to remove elements from an array. Now you’ll look at how to modify the element you already have.
Modifying Existing Elements in Arrays
To update an element in the array, assign a new value to the element’s index by using the assignment operator, just like you would with a regular variable.
Given a new array of sharks, with "Hammerhead"
at index ``, you’ll replace "Hammerhead"
with "Angel"
:
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks[0] = "Angel"
print sharks;
["Angel", "Great White", "Tiger", "Whale"]
To make sure you update the right element, you could use the index
method to locate the element first, just like you did to find the element you wanted to delete.
Now you’ll look at how to work with all of the elements in the array.
Iterating Over Arrays
Ruby provides many ways to iterate over an array, and each method you use depends on the kind of work you want to perform. Next you’ll explore how to iterate over an array and display each of its elements.
Ruby provides the for..in
syntax:
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
for shark in sharks do
puts shark
end
For each element in the sharks
array, Ruby assigns that element to the local variable shark
. You can then print the element’s value using puts
.
You won’t see for..in
very often though. Ruby arrays are objects, and they provide the each
method for working with elements. The each
method works in a similar fashion to for..in
, but has a different syntax:
each.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each do |shark|
puts shark
end
The each
method uses a syntax you’ll see often in Ruby programming. It takes a Ruby block as its argument. A block is some code that will be executed later in the context of the method. In this case, the code is puts shark
. The shark
keyword, enclosed in the pipe characters (|
), is the local variable that represents the element in the array that the block will access. Ruby assigns the element to this variable and executes the code in the block. The each
method repeats this process for each element in the array:
Hammerhead
Great White
Tiger
Whale
When the block is only a single line, you often see Ruby developers replace the do
and end
keywords with curly braces and condense the whole statement into a single line:
each.rb
...
sharks.each {|shark| puts shark }
This produces the same results but uses fewer lines of code.
The each_with_index
method works in a similar manner, but it also gives you access to the index of the array element. This program uses each_with_index
to print out the index and the value for each element:
each_with_index.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each_with_index do |shark, index|
puts "The index is #{index}"
puts "The value is #{shark}"
end
For each element in the array, Ruby assigns the element to the variable shark
, and assigns the current index to the index
variable. You can then reference both of those variables in the block.
The index is 0
The value is Hammerhead
The index is 1
The value is Great White
The index is 2
The value is Tiger
The index is 3
The value is Whale
You’ll iterate over the elements in an array often in your own programs, such as when you need to display the items from a database on a website, or when you’re reading lines from a file and processing their contents.
Conclusion
Arrays are an extremely versatile and fundamental part of programming in Ruby. In this tutorial, you created arrays and accessed individual elements. You also added, removed, and modified elements in an array. Finally, you explored two ways to iterate over an array and display its contents, which is used as a common method to display data.
Learn about other data types in Ruby by reading the tutorial Understanding Data Types in Ruby.