Look at this code :
def hello
p "Hey!"
end
p hello
the output will be:
"Hey!"
"Hey!"
=> "Hey!"
And so here is my conclusion: puts itself returns the text which is going to be sent in output in Ruby code, else it wouldn’t print “Hey!” again. What is happening while printing the string? If puts doesn’t send it to standard output directly, who is responsible for it and how?
All Methods Return a Value
In Ruby, almost everything returns a value, even if that value is nil. However, in your case the issue is that Kernel#p and Kernel#puts differ in the values they return.
As a result, the string gets printed once inside the method, and then the method’s return value is passed to Kernel#p and printed again. This is by design.
Use Kernel#puts to Avoid Duplicated Output
This will result in the string literal being printed inside the method, and then a blank line printed since the return value from the method is nil.
The Right Way
If you want to avoid the blank line, avoid sending to standard output more than once. For example: