📖 Scenario: You are helping a small bakery keep track of daily sales. Each sale has a product name and the quantity sold. You want to use Ruby blocks to process this sales data.
🎯 Goal: Learn how to use Ruby blocks with both do..end and curly braces {} syntax to iterate over sales data and calculate total items sold.
📋 What You'll Learn
Create a hash called sales with exact product names and quantities
Create a variable total_items to hold the sum of all quantities
Use a do..end block with each to add quantities to total_items
Use a curly braces {} block with each to print each product and quantity
Print the total number of items sold
💡 Why This Matters
🌍 Real World
Blocks let you process collections like sales data easily, which is common in business apps.
💼 Career
Understanding block syntax is essential for Ruby developers working on data processing, web apps, and automation.
Progress0 / 4 steps
1
Create the sales data hash
Create a hash called sales with these exact entries: 'Bread' => 10, 'Cake' => 5, 'Pie' => 7
Ruby
Hint
Use curly braces {} to create the hash with keys and values separated by =>.
2
Create a total_items variable
Create a variable called total_items and set it to 0
Ruby
Hint
Just write total_items = 0 to start counting from zero.
3
Use a do..end block to sum quantities
Use sales.each do |product, quantity| ... end to add each quantity to total_items
Ruby
Hint
Use each do |product, quantity| ... end to loop through the hash and add quantities.
4
Use curly braces block to print sales and print total
Use sales.each { |product, quantity| puts "#{product}: #{quantity}" } to print each product and quantity. Then print total_items with puts total_items
Ruby
Hint
Use curly braces {} with each to print each item. Use puts total_items to show the total.
Practice
(1/5)
1. Which block syntax is generally preferred for multi-line blocks in Ruby?
easy
A. Both are equally preferred for multi-line blocks
B. { }
C. Neither; Ruby does not support blocks
D. do..end
Solution
Step 1: Understand block syntax options
Ruby supports two block syntaxes: do..end and curly braces { }.
Step 2: Identify usage for multi-line blocks
do..end is preferred for multi-line blocks because it improves readability.
Final Answer:
do..end -> Option D
Quick Check:
Multi-line blocks use do..end [OK]
Hint: Use do..end for multi-line blocks, braces for single-line [OK]
Common Mistakes:
Using curly braces for multi-line blocks reduces readability
Thinking Ruby doesn't support blocks
Believing both syntaxes are identical in all cases
2. Which of the following is the correct syntax for a single-line block that prints each number in an array?
easy
A. [1, 2, 3].each { |n| puts n }
B. [1, 2, 3].each { n puts | }
C. [1, 2, 3].each (|n| puts n )
D. [1, 2, 3].each do |n| puts n
Solution
Step 1: Identify correct block syntax for single-line
Single-line blocks use curly braces { } with parameters inside pipes | |.
Step 2: Check syntax correctness
[1, 2, 3].each { |n| puts n } correctly uses { |n| puts n }. Others have syntax errors.
Final Answer:
[1, 2, 3].each { |n| puts n } -> Option A
Quick Check:
Single-line block with braces and pipes [OK]
Hint: Use { |var| ... } for single-line blocks [OK]
Common Mistakes:
Missing pipes around block parameters
Using do..end without proper line breaks
Incorrect placement of pipes or braces
3. What is the output of the following Ruby code?
(1..3).map { |x| x * 2 }
medium
A. [1, 2, 3]
B. [2, 4, 6]
C. [3, 6, 9]
D. SyntaxError
Solution
Step 1: Understand the range and map method
The range (1..3) produces numbers 1, 2, 3. The map method applies the block to each number.
Step 2: Calculate each mapped value
Each number is multiplied by 2, resulting in 2, 4, and 6.
Final Answer:
[2, 4, 6] -> Option B
Quick Check:
Map doubles each element [OK]
Hint: map applies block to each element and returns new array [OK]
Common Mistakes:
Confusing map with each (which returns original array)
Expecting a syntax error due to block syntax
Misunderstanding range behavior
4. Identify the error in this Ruby code:
5.times do |i| puts i }
medium
A. Missing closing end for the block
B. Missing block parameter pipes | |
C. Incorrect use of curly brace to close a do..end block
D. No error, code runs fine
Solution
Step 1: Check block opening and closing syntax
The block starts with do but incorrectly ends with a curly brace }.
Step 2: Understand correct block closure
Blocks opened with do must close with end, not }.
Final Answer:
Incorrect use of curly brace to close a do..end block -> Option C
Quick Check:
do..end blocks cannot close with braces [OK]
Hint: Match do with end, braces with braces [OK]
Common Mistakes:
Mixing do..end with curly braces
Forgetting to close the block
Misplacing block parameter pipes
5. Given the array [1, 2, 3, 4], which block syntax correctly filters even numbers and returns them as a new array?
hard
A. [1, 2, 3, 4].select { |n| n.even? }
B. [1, 2, 3, 4].select do |n| n.even?
C. [1, 2, 3, 4].select { n.even? }
D. [1, 2, 3, 4].select do n.even? end
Solution
Step 1: Understand the select method and block parameters
select filters elements for which the block returns true. The block must receive each element as a parameter.
Step 2: Check syntax correctness
[1, 2, 3, 4].select { |n| n.even? } correctly uses curly braces with block parameter |n| and calls n.even?. [1, 2, 3, 4].select do |n| n.even? has a syntax error (missing end). [1, 2, 3, 4].select { n.even? } misses block parameters. [1, 2, 3, 4].select do n.even? end misses pipes around parameter.
Final Answer:
[1, 2, 3, 4].select { |n| n.even? } -> Option A
Quick Check:
Curly braces with pipes for single-line filter [OK]
Hint: Use { |var| condition } for concise filtering blocks [OK]
Common Mistakes:
Omitting block parameters
Mixing do..end without pipes for parameters
Using incorrect block syntax causing errors
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.