» Making a Strong Argument
Ruby's ArgumentError is raised when you call a method with incorrect arguments. There are several ways in which an argument could be considered incorrect in Ruby:
- The number of arguments (arity) is wrong
- The value of the argument is unacceptable
- The keyword is unknown when using keyword arguments
Because Ruby itself uses ArgumentError in these conditions, many Ruby developers extend the pattern when building their own methods.
For example, say that you have a list of creatures and want to print the most popular:
CREATURES = ['NoMethodError', 'TypeError', 'ArgumentError', 'RuntimeError']
def top(n)
puts CREATURES[0...n]
end
top(2) # =>
# NoMethodError
# TypeError
Since there are 4 creatures, calling top with an argument up to 4 will print 4 values. However, what happens when we call top with an argument of 5?
top(5) # =>
# NoMethodError
# TypeError
# ArgumentError
# RuntimeError
Since there are 4 values in the array, 4 are printed. This could be confusing if our calling code is expecting 5 values. Let's make our method raise an exception when the argument is larger than the total number of values in the array:
def top(n)
raise ArgumentError.new(
"Expected a value of 1-#{CREATURES.size}, got #{n}"
) if CREATURES.size < n
puts CREATURES[0...n]
end
Now, when we call top(5), we get a helpful error telling us exactly what we did wrong:
top(5) # => ArgumentError: Expected a value of 1-4, got 5
» Extra Credit
What happens if you call the top method with zero, or a negative value? If you're new to ruby, try extending top to raise ArgumentError for these exceptional cases!
» Argument vs. Parameter: Did You Know?
You may have seen the terms argument and parameter used (seemingly) interchangeably when discussing method definitions. That's because there is a slight distinction between these two terms! Let's revisit our top method:
def top(number)
puts CREATURES[0...number]
end
The word number on the first line of the method definition is called a parameter. It hasn't been used to call the method yet. Now, say you want to call the method you've created:
top(100)
The value 100 that you're passing to the top method is called an argument.