The yield Keyword
In this chapter, you will the basics of yield keyword. We will implement our own version of the Ruby built-in times method to get a better understanding of how it works.
Yield Example
Let's look at an example that uses yield keyword to execute code.
class Actor
def act
yield
end
end
snowy = Actor.new
snowy.act { p 'wag the tail' }
The act method in Actor class has the yield keyword. The yield keyword yields flow of control to the block that calls the act method. In our example, the code between the curly braces is the block that gets executed. This prints:
wag the tail
Code Block
Our simple hail taxi program uses a block with do-end keywords.
3.times do
p 'Taxi'
end
The code block is part of the syntax of the method call. The times method is called with the block that prints Taxi.
Implementing times Method
Let's write our version of times method to get a better understanding of the Ruby built-in times method.
class Fixnum
def my_times
for i in 1..self
yield
end
end
end
3.my_times do
p 'Taxi'
end
We re-opened the Fixnum class to define our my_times method. Inside the for loop, we call the block using the yield keyword. The block is a nameless function and has no name, so yield is the only way to call it. You can think of yield keyword as yielding control of flow to the block. We then call my_times method with a block as an implicit argument. This produces the same output.
Fabio Asks
I am getting:
LocalJumpError: no block given (yield)
when I run the code without a block.
class Fixnum
def my_times
for i in 1..self
yield
end
end
end
3.my_times
You can prevent this error by checking if the block is given.
class Fixnum
def my_times
for i in 1..self
yield if block_given?
end
end
end
3.my_times
Summary
In this chapter, you learned the basics of yield keyword. We implemented our own version of the Ruby built-in times method to get a better understanding of how it works.