franksort
franksort

Reputation: 3143

Returning a string from a Ruby function

In this example:

def hello
  puts "hi"
end

def hello
  "hi"
end

What's the difference between the first and second functions?

Upvotes: 1

Views: 6160

Answers (3)

zeantsoi
zeantsoi

Reputation: 26193

In Ruby functions, when a return value is not explicitly defined, a function will return the last statement it evaluates. If only a print statement is evaluated, the function will return nil.

Thus, the following prints the string hi and returns nil:

puts "hi"

In contrast, the following returns the string hi:

"hi"

Consider the following:

def print_string
  print "bar"
end

def return_string
  "qux" # same as `return "qux"`
end

foo = print_string
foo #=> nil

baz = return_string
baz #=> "qux"

Note, however, that you can print and return something out of the same function:

def return_and_print
  print "printing"
  "returning" # Same as `return "returning"`
end

The above will print the string printing, but return the string returning.

Remember that you can always explicitly define a return value:

def hello
  print "Someone says hello" # Printed, but not returned
  "Hi there!"                # Evaluated, but not returned
  return "Goodbye"           # Explicitly returned
  "Go away"                  # Not evaluated since function has already returned and exited
end

hello
#=> "Goodbye"

So, in sum, if you want to print something out of a function, say, to the console/log – use print. If you want to return that thing out of the function, don't just print it – ensure that it is returned, either explicitly or by default.

Upvotes: 10

edwardsmatt
edwardsmatt

Reputation: 2044

The first one uses the puts method to write "hi" out to the console and returns nil

the second one returns the string "hi" and doesn't print it

Here's an example in an irb session:

2.0.0p247 :001 > def hello
2.0.0p247 :002?>   puts "hi"
2.0.0p247 :003?> end
 => nil 
2.0.0p247 :004 > hello
hi
 => nil 
2.0.0p247 :005 > def hello
2.0.0p247 :006?>   "hi"
2.0.0p247 :007?> end
 => nil 
2.0.0p247 :008 > hello
 => "hi"
2.0.0p247 :009 > 

Upvotes: 1

sonnyhe2002
sonnyhe2002

Reputation: 2121

puts prints it to the console. So

def world
  puts 'a'
  puts 'b'
  puts 'c'
end

Will print 'a' then 'b' then 'c' to the console.

def world
  'a'
  'b'
  'c'
end

This will return the last thing, so you will only see 'c'

Upvotes: 0

Related Questions