Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Difference between puts and print for Array
I have an array
friends = Array.new
friends[0] = "Mad man"
friends[1] = "hey"
There's two ways to print it (using print or puts). At first I tried print
print friends
which gave:
["Mad man", "Hey"]
When I tried puts
puts friends
I got:
Mad man
Hey
I thought that the difference between puts and print is puts add a new line and, print doesn't. But, why was print directly giving output of that array (and not separating elements)?
1 answer
The official ruby documentation explains the observed difference between the outputs of print and 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).
puts
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.
Contrary to print, 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 print with puts by explicitly invoking the to_s method like:
puts friends.to_s
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.)

1 comment thread