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

···

--
Posted via http://www.ruby-forum.com/.

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

···

On 28/04/11 08:25, Fily Salas wrote:

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

Hi Fily

···

2011/4/27 Fily Salas <fs_tigre@hotmail.com>:

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.

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.

--
Roger Braun
rbraun.net | humoralpathologie.de

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

···

--
Posted via http://www.ruby-forum.com/\.

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

···

--
Posted via http://www.ruby-forum.com/.