This is where irb is handy. The short of it is that in your first example a string is returned on which you call upcase. In your second example the thing returned is the result of puts, which is nil.
I was practicing ruby and accidentally came across something that got me
thinking (nothing important but I want to know why).
Why does the example-1 works and not example-2, if all I'm doing is
moving the puts?
Example-1:
def message
"this is working"
end
puts message.upcase
Example-2:
def message
puts "this is working"
end
message.upcase
Can someone explain this a little bit? I could just ignore it but I
would like to know the reason.
The return value of the "puts" method is always nil, not the string it
prints. What your second example does is try to invoke the "upcase"
method on nil.
Since the nil is the last thing that is read in the method, upcase is
called on that nil and upcase throws an error b/c you can't use that
method on a nil. Make sense?