Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use of yield and return in Ruby

Tags:

ruby

block

Can anyone help me to figure out the the use of yield and return in Ruby. I'm a Ruby beginner, so simple examples are highly appreciated.

Thank you in advance!

like image 482
Hoa Nguyen Avatar asked May 04 '12 14:05

Hoa Nguyen


People also ask

What does yield return in Ruby?

Yield with Return value: It is possible to get the return value of a block by simply assigning the return value of a yield to a variable. if we use yield with an argument, it will pass that argument to the block. # Ruby program of using yield keyword. # with return value.

How does yield work in Ruby?

yield is a keyword in Ruby which allow the developer to pass some argument to block from the yield, the number of the argument passed to the block has no limitations, the main advantage of using yield in Ruby, if we face any situation we wanted to our method perform different functions according to calling block, which ...

What is the use of yield in rails?

If we want to call a block multiple times, we can pass it to our method by sending a proc or lamda. But yield is more convenient and quicker in Rails 6 for the same task. Note: yield allows us to inject blocks into a function at any point.

Can you use return in Ruby?

Ruby methods ALWAYS return the evaluated result of the last line of the expression unless an explicit return comes before it. If you wanted to explicitly return a value you can use the return keyword.


3 Answers

The return statement works the same way that it works on other similar programming languages, it just returns from the method it is used on. You can skip the call to return, since all methods in ruby always return the last statement. So you might find method like this:

def method
  "hey there"
end

That's actually the same as doing something like:

def method
  return "hey there"
end

The yield on the other hand, excecutes the block given as a parameter to the method. So you can have a method like this:

def method 
  puts "do somthing..."
  yield
end

And then use it like this:

method do
   puts "doing something"
end

The result of that, would be printing on screen the following 2 lines:

"do somthing..."
"doing something"

Hope that clears it up a bit. For more info on blocks, you can check out this link.

like image 136
Deleteman Avatar answered Oct 06 '22 00:10

Deleteman


yield is used to call the block associated with the method. You do this by placing the block (basically just code in curly braces) after the method and its parameters, like so:

[1, 2, 3].each {|elem| puts elem}

return exits from the current method, and uses its "argument" as the return value, like so:

def hello
  return :hello if some_test
  puts "If it some_test returns false, then this message will be printed."
end

But note that you don't have to use the return keyword in any methods; Ruby will return the last statement evaluated if it encounters no returns. Thus these two are equivelent:

def explicit_return
  # ...
  return true
end

def implicit_return
  # ...
  true
end

Here's an example for yield:

# A simple iterator that operates on an array
def each_in(ary)
  i = 0
  until i >= ary.size
    # Calls the block associated with this method and sends the arguments as block parameters.
    # Automatically raises LocalJumpError if there is no block, so to make it safe, you can use block_given?
    yield(ary[i])
    i += 1
  end
end

# Reverses an array
result = []     # This block is "tied" to the method
                #                            | | |
                #                            v v v
each_in([:duck, :duck, :duck, :GOOSE]) {|elem| result.insert(0, elem)}
result # => [:GOOSE, :duck, :duck, :duck]

And an example for return, which I will use to implement a method to see if a number is happy:

class Numeric
  # Not the real meat of the program
  def sum_of_squares
    (to_s.split("").collect {|s| s.to_i ** 2}).inject(0) {|sum, i| sum + i}
  end

  def happy?(cache=[])
    # If the number reaches 1, then it is happy.
    return true if self == 1
    # Can't be happy because we're starting to loop
    return false if cache.include?(self)
    # Ask the next number if it's happy, with self added to the list of seen numbers
    # You don't actually need the return (it works without it); I just add it for symmetry
    return sum_of_squares.happy?(cache << self)
  end
end

24.happy? # => false
19.happy? # => true
2.happy?  # => false
1.happy?  # => true
# ... and so on ...

Hope this helps! :)

like image 28
Jwosty Avatar answered Oct 06 '22 00:10

Jwosty


def cool
  return yield
end

p cool {"yes!"}

The yield keyword instructs Ruby to execute the code in the block. In this example, the block returns the string "yes!". An explicit return statement was used in the cool() method, but this could have been implicit as well.

like image 29
HardSystem Avatar answered Oct 05 '22 23:10

HardSystem