The official ruby documentation explains the observed difference between the outputs of
puts. The important bits are as follows:
For any non-string object given as argument (such as an array, for example),
print invokes the object's
to_s method and outputs the resulting string returned by
to_s. Quote from doc (link):
Each given object that isn't a string will be converted by calling its to_s method.
And as it so happens, the
to_s method of your array produces the
["Mad man", "Hey"] output you observe (and which is also documented, link).
On the other hand,
puts behaves differently when provided with an array. Quote from doc (link):
If called with an array argument, writes each element on a new line. Each given object that isn't a string or array will be converted by calling its to_s method.
puts does NOT call the array's
to_s method but rather directly outputs the array elements line-by-line.
By the way, you can also achieve almost the same output as
puts by explicitly invoking the
to_s method like:
which will output
["Mad man", "hey"]
(It is only almost the same output as
print friends, since
puts writes a newline at the end of the output, whereas
print does not -- unless of course you change the output record separator to a newline. See also hkotsubo's comment below.)