Help me understand this SIMPLE Ruby code, using puts in a def

Hi,

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.

Thanks

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.

irb
ruby-1.9.2-p0 > foo = puts ‘foo’
foo
=> nil
ruby-1.9.2-p0 > foo
=> nil
ruby-1.9.2-p0 > foo.upcase
NoMethodError: undefined method `upcase’ for nil:NilClass

Does that help?

Sam

I agree with Sam:

def message
“this is working”
end
=> nil

puts message.upcase
THIS IS WORKING
=> nil

def message1
puts “this is working”
end
=> nil

puts message1
this is working
nil <----- extra nil
=> 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?

-Cee

Hi Fily

2011/4/27 Fily S. [email protected]:

“this is working”
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.

Got it. Thank you all very much for your help!