Bird
Raised Fist0
Rubyprogramming~10 mins

Yield to execute blocks in Ruby - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Yield to execute blocks
Define method with yield
↓
Call method
↓
Inside method: execute code before yield
↓
Yield: pause method, run block passed
↓
Block runs: executes block code
↓
Return to method after yield
↓
Execute code after yield
↓
Method ends
The method runs code, then pauses at yield to run the passed block, then continues after the block finishes.
Execution Sample
Ruby
def greet
  puts "Hello"
  yield
  puts "Goodbye"
end

greet { puts "How are you?" }
This code defines a method that prints 'Hello', then runs a block, then prints 'Goodbye'.
Execution Table
StepActionOutputNotes
1Call greet methodMethod starts execution
2puts "Hello"HelloPrints greeting
3yield to blockPauses method, runs block
4Block runs: puts "How are you?"How are you?Block code executes
5Return to method after yieldMethod resumes
6puts "Goodbye"GoodbyePrints farewell
7Method endsExecution complete
💡 Method finishes after printing 'Goodbye'
Variable Tracker
VariableStartAfter Step 2After Step 4Final
No variables----
Key Moments - 2 Insights
Why does the block code run between the two puts statements?
Because the method uses yield at step 3 to pause and run the block, then continues after the block finishes (see execution_table rows 3-5).
What happens if no block is given when calling the method?
The method will raise an error at yield because it expects a block to run. You can check with block_given? to avoid this.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is printed at step 4?
A"How are you?"
B"Goodbye"
C"Hello"
DNothing
💡 Hint
Check the Output column at step 4 in the execution_table.
At which step does the method resume after running the block?
AStep 2
BStep 3
CStep 5
DStep 6
💡 Hint
Look at the Notes column for step 5 in the execution_table.
If we remove the yield line, what changes in the output?
AOnly "Hello" is printed
B"Hello" and "Goodbye" are printed, block is not run
COnly the block output is printed
DNothing is printed
💡 Hint
Yield is the only place where the block runs, so without it the block code is skipped.
Concept Snapshot
def method
  code before yield
  yield  # runs block passed to method
  code after yield
end

Calling method with a block runs the block at yield.
Without yield, block is not executed.
Full Transcript
This example shows how Ruby's yield keyword lets a method run a block of code passed to it. The method greet prints 'Hello', then yield pauses the method and runs the block which prints 'How are you?'. After the block finishes, the method resumes and prints 'Goodbye'. The execution table traces each step and output. Key points: yield runs the block inside the method, and the method continues after yield. If no block is given, yield causes an error unless checked. Removing yield means the block never runs. This helps write flexible methods that can run custom code blocks.

Practice

(1/5)
1. What does the yield keyword do in a Ruby method?
easy
A. It runs the block of code passed to the method.
B. It returns the method's value immediately.
C. It defines a new method inside the current method.
D. It pauses the method execution permanently.

Solution

  1. Step 1: Understand the role of yield

    The yield keyword is used inside a method to call the block that was passed to that method.
  2. Step 2: Differentiate from other keywords

    Unlike return or method definitions, yield specifically executes the block given to the method.
  3. Final Answer:

    It runs the block of code passed to the method. -> Option A
  4. Quick Check:

    Yield executes block = A [OK]
Hint: Yield always runs the block given to the method [OK]
Common Mistakes:
  • Thinking yield returns method value
  • Confusing yield with return
  • Assuming yield defines a method
2. Which of the following is the correct syntax to use yield with an argument inside a method?
easy
A. def example; yield(5); end
B. def example; yield5; end
C. def example; yield = 5; end
D. def example; yield: 5; end

Solution

  1. Step 1: Recall yield syntax with arguments

    To pass arguments to the block, yield must be called with parentheses around the arguments, like yield(5).
  2. Step 2: Check other options for syntax errors

    Options B, C, and D are incorrect because they either miss parentheses or use invalid syntax.
  3. Final Answer:

    def example; yield(5); end -> Option A
  4. Quick Check:

    Yield with args uses parentheses = A [OK]
Hint: Use parentheses to pass arguments with yield [OK]
Common Mistakes:
  • Omitting parentheses when passing arguments
  • Using assignment (=) with yield
  • Using colon (:) instead of parentheses
3. What will be the output of the following Ruby code?
def greet
  yield("Alice")
end

greet { |name| puts "Hello, #{name}!" }
medium
A. Error: no block given
B. Hello, Alice!
C. Hello, !
D. Hello, name!

Solution

  1. Step 1: Understand yield with argument

    The method greet calls yield with the string "Alice" as argument, passing it to the block.
  2. Step 2: Evaluate the block execution

    The block receives "Alice" as name and prints "Hello, Alice!".
  3. Final Answer:

    Hello, Alice! -> Option B
  4. Quick Check:

    Yield passes "Alice" to block = C [OK]
Hint: Yield passes arguments to block parameters [OK]
Common Mistakes:
  • Ignoring the argument passed to yield
  • Assuming block is not called
  • Confusing variable names in block
4. Identify the error in the following Ruby code:
def run_block
  yield if block_given
end

run_block { puts "Block executed" }
medium
A. yield cannot be used without arguments
B. Syntax error in method definition
C. Block is not passed to the method
D. Missing question mark (?) in block_given? method call

Solution

  1. Step 1: Check usage of block_given?

    The method to check if a block is given is block_given?, note the question mark.
  2. Step 2: Identify the error in code

    The code uses block_given without the question mark (?), which causes a NameError because block_given is not a valid method.
  3. Final Answer:

    Missing question mark (?) in block_given? method call -> Option D
  4. Quick Check:

    Use block_given? with question mark [OK]
Hint: Always use block_given? (with ?) [OK]
Common Mistakes:
  • Forgetting question mark (?) on block_given?
  • Assuming yield needs arguments always
  • Not passing a block when expected
5. Given the method below, what will be the output?
def repeat(n)
  if block_given?
    n.times { |i| yield(i) }
  else
    puts "No block given"
  end
end

repeat(3) { |num| puts num * 2 }
hard
A. 0 1 2
B. 1 2 3
C. 0 2 4
D. No block given

Solution

  1. Step 1: Analyze the method behavior

    The method repeat checks if a block is given. Since a block is passed, it runs n.times and yields the index i to the block.
  2. Step 2: Evaluate the block execution

    The block multiplies each yielded number by 2 and prints it. For n=3, i goes 0,1,2, so outputs are 0, 2, 4.
  3. Final Answer:

    0 2 4 -> Option C
  4. Quick Check:

    Yield with times and block multiplies index = D [OK]
Hint: Yield passes each index to block in times loop [OK]
Common Mistakes:
  • Confusing index values starting at 1
  • Ignoring block_given? check
  • Expecting output without block
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard