Questions and commands
Generally speaking, methods play one of two roles: They either answer a question, or they perform a command.
For example, if we have a user
object, and users have a name, then we would
ask the user object for its name by calling the method name
: user.name
would return the user’s name. Arrays know their size (how many elements they
have), so we can ask an array: [1, 2, 3].size
will return 3
.
Another example is the method sort
on arrays. This method does not actually
sort the array that it is called on. Instead it returns a new array with the
same values, but in a sorted order:
array = [3, 2, 1]
p array.sort
p array
This will output [1, 2, 3]
and then [3, 2, 1]
. So we see that the original
array is still the same.
Often questions need another bit of information passed. E.g., we can ask
a string Do you start with this character?, and we’ll need to pass the
character that we are talking about: "a string".start_with?("a")
. The answer
to this question will be true
. Or if we ask an array if it includes a certain
element, then of course we need to pass that element, as in [1, 2,
3].include?(1)
The other role that a method can play is being responsible for executing a certain command.
For example in Rails objects that can be stored to the database have a method
save
. Of course, the purpose of this method is to save the object to the
database. E.g. user.save
would save some changes that we’ve made to the user
before, like, maybe we have given them a new password.
Another example is the method sort!
on arrays. Different from the method
sort
(without an exclamation mark), this method tells the array to sort
itself:
array = [3, 2, 1]
array.sort!
p array
If you run this code, then it will print out [1, 2, 3]
: the array is now
sorted.
Another example for a method that is a command is the method puts
. All it
does is print something to the screen, and it always returns nil
.
Whenever you think about adding a new method to your code it makes sense to think about the role the method should have. Is it a question? Or a command?