Bird
Raised Fist0
Rubyprogramming~15 mins

Block given? check in Ruby - Mini Project: Build & Apply

Choose your learning style10 modes available
Block given? check
📖 Scenario: You are creating a simple Ruby method that behaves differently depending on whether a block is given or not. This is useful when you want to allow extra customization but also have a default behavior.
🎯 Goal: Build a Ruby method called greet that prints a default greeting if no block is given, and uses the block to customize the greeting if a block is provided.
📋 What You'll Learn
Create a method named greet
Use block_given? inside the method to check if a block is passed
Print "Hello, World!" if no block is given
If a block is given, call the block and print its result
💡 Why This Matters
🌍 Real World
Checking if a block is given allows Ruby methods to be flexible and customizable, which is common in libraries and frameworks.
💼 Career
Understanding blocks and <code>block_given?</code> is essential for Ruby developers, especially when working with Rails or writing reusable code.
Progress0 / 4 steps
1
Define the greet method
Write a method called greet with no parameters.
Ruby
Hint
Use def greet to start the method and end to finish it.
2
Check if a block is given
Inside the greet method, use block_given? to check if a block is passed.
Ruby
Hint
Use an if statement with block_given? inside the method.
3
Call the block or print default greeting
Inside the greet method, if a block is given, call the block with yield and print its result. Otherwise, print "Hello, World!".
Ruby
Hint
Use puts yield to call and print the block result, and puts "Hello, World!" for the default.
4
Test the greet method with and without a block
Write two lines: call greet without a block, then call greet with a block that returns "Hi there!". This will show both behaviors.
Ruby
Hint
Call greet alone, then call greet { "Hi there!" } to test both cases.

Practice

(1/5)
1. What does the Ruby method block_given? check inside a method?
easy
A. If the method is defined inside a class
B. If the method has any parameters
C. If the method returns a value
D. If a block was passed to the method

Solution

  1. Step 1: Understand the purpose of block_given?

    This method returns true if the current method was called with a block passed to it.
  2. Step 2: Differentiate from other method checks

    It does not check parameters, return values, or class definitions, only the presence of a block.
  3. Final Answer:

    If a block was passed to the method -> Option D
  4. Quick Check:

    block_given? checks block presence = A [OK]
Hint: block_given? tells if a block is passed to method [OK]
Common Mistakes:
  • Confusing block_given? with method parameters
  • Thinking it checks return values
  • Assuming it checks class membership
2. Which of the following is the correct syntax to check if a block was given inside a Ruby method?
easy
A. if block_given then yield end
B. if block_given? () yield end
C. if block_given? then yield end
D. if block_given? yield () end

Solution

  1. Step 1: Identify correct method call syntax

    block_given? is a method and should be called with a question mark and optionally parentheses. The most common and clear syntax is block_given? without parentheses.
  2. Step 2: Confirm correct use of yield

    The yield keyword runs the block if it exists. The syntax if block_given? then yield end is correct and clear.
  3. Final Answer:

    if block_given? then yield end -> Option C
  4. Quick Check:

    Correct syntax uses block_given? and yield [OK]
Hint: Use block_given? with question mark and yield inside if [OK]
Common Mistakes:
  • Omitting question mark in block_given?
  • Using block_given without parentheses incorrectly
  • Calling yield with parentheses unnecessarily
3. What will be the output of this Ruby code?
def greet
  if block_given?
    yield
  else
    puts "Hello!"
  end
end

greet { puts "Hi there!" }
greet
medium
A. Hi there!\nHello!
B. Hello!\nHello!
C. Hi there!\nHi there!
D. No output

Solution

  1. Step 1: Analyze first greet call with block

    The first call passes a block that prints "Hi there!". Since block_given? is true, yield runs the block, printing "Hi there!".
  2. Step 2: Analyze second greet call without block

    The second call has no block, so block_given? is false and the else branch runs, printing "Hello!".
  3. Final Answer:

    Hi there!\nHello! -> Option A
  4. Quick Check:

    Block runs first, then default message = A [OK]
Hint: Block runs if given; else default runs [OK]
Common Mistakes:
  • Assuming yield runs even without block
  • Thinking both calls print the same message
  • Confusing order of outputs
4. Identify the error in this Ruby method:
def show
  yield if block_given
end

show { puts "Hello!" }
medium
A. Missing question mark in block_given method call
B. yield cannot be used without arguments
C. Method show requires a parameter
D. Block cannot be passed to show method

Solution

  1. Step 1: Check block_given usage

    The method block_given? requires the question mark and should be called as block_given? or block_given?(). Here it is missing the question mark.
  2. Step 2: Confirm yield usage

    The yield is correctly used and does not require arguments here. The method does not require parameters to accept a block.
  3. Final Answer:

    Missing question mark in block_given method call -> Option A
  4. Quick Check:

    block_given? needs question mark [OK]
Hint: Always use block_given? with question mark [OK]
Common Mistakes:
  • Omitting question mark in block_given
  • Thinking yield needs arguments always
  • Assuming method needs parameters for blocks
5. You want to write a Ruby method process_items that takes an array and optionally a block. If a block is given, it should yield each item to the block; otherwise, it should return the array unchanged. Which code correctly implements this behavior?
hard
A. def process_items(arr) arr.each { |item| yield item if block_given? } end
B. def process_items(arr) if block_given? arr.each { |item| yield item } else arr end end
C. def process_items(arr) if block_given arr.each { |item| yield item } else arr end end
D. def process_items(arr) arr.each { |item| yield item } end

Solution

  1. Step 1: Check block presence correctly

    def process_items(arr) if block_given? arr.each { |item| yield item } else arr end end uses block_given? correctly to check if a block is passed before yielding.
  2. Step 2: Handle both cases properly

    If a block is given, it yields each item; otherwise, it returns the original array unchanged, matching the requirement.
  3. Step 3: Review other options for errors

    def process_items(arr) arr.each { |item| yield item } end always yields without checking block presence, causing error if no block given. def process_items(arr) if block_given arr.each { |item| yield item } else arr end end misses question mark in block_given. def process_items(arr) arr.each { |item| yield item if block_given? } end yields conditionally inside each, but block_given? inside the each block always returns false so no yielding occurs, though it returns the array.
  4. Final Answer:

    def process_items(arr) if block_given? arr.each { |item| yield item } else arr end end -> Option B
  5. Quick Check:

    Check block_given? before yield and return array if no block [OK]
Hint: Check block_given? before yield; else return array [OK]
Common Mistakes:
  • Not checking block_given? before yield
  • Missing question mark in block_given
  • Returning nil instead of array when no 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