Today, when I am refactoring a CLI I wrote, I came across a code block where I check whether an index exists in an array (turns out I don’t actually need it, I can just access the array and check if the value is nil). I went to search of Ruby Array documentation to see if such method exists. Then, I came across Array#fetch while scrolling through the documetantion.

Array#fetch

In Ruby Array, fetch is a method that get the value at position index of an array. The difference between fetch and .[] is fetch throws an IndexError if the index doesn’t exists.

array = [1, 2, 3]
array.fetch(0) #=> 1
array.fetch(4) #=> IndexError: index 4 outside of array bounds: -3...3

If we take a look at the Ruby documentation of Array#fetch, we’ll see that fetch has the following definitions:

fetch(index) -> Object
fetch(index, default) -> Object
fetch(index) { |index| block } -> Object

Which means, we can also provide a default value as the result if the index isn’t found. For example:

array = [1, 2, 3]
array.fetch(4, 0)
#=> 0

Or provide a block to be executed if the index is not found:

array = [1, 2, 3]
array.fetch(4) { |index| "The index '#{index}' is not found" }
#=> "The index '4' is not found"

Possible Use Case

Array#fetch can be used when we need to provide a default value if the index is not found.

users = ['Peter', 'Jane', 'John Wick']
name = users.fetch(4, 'User not found')

puts name
"User not found"
#=> nil

For example, we have a method to allow to search other users (which store in array) and print out the name as a response. To handle the scenario where the user is not found, we can implement it by providing a default value with Array#fetch. No additional handling code is required.

If you know the other possible use cases of Array#fetch, feel free to share it out.