» 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 )