Bird
Raised Fist0
Rubyprogramming~10 mins

DSL building patterns in Ruby - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to define a simple DSL method that yields to a block.

Ruby
def my_dsl_method
  [1]
end
Drag options to blanks, or click blank then click option'
Ayield
Breturn
Cputs
Dbreak
Attempts:
3 left
💡 Hint
Common Mistakes
Using return instead of yield stops the method without running the block.
Using puts prints text but does not execute the block.
2fill in blank
medium

Complete the code to define a DSL method that takes a block and instance_eval's it.

Ruby
def configure
  instance_eval [1]
end
Drag options to blanks, or click blank then click option'
A&block
Bblock
Cyield
Dself
Attempts:
3 left
💡 Hint
Common Mistakes
Passing block without & causes an error because block is not defined as a variable.
Using yield here does not work with instance_eval.
3fill in blank
hard

Fix the error in the DSL method that tries to store configuration values.

Ruby
class Config
  def initialize
    @settings = {}
  end

  def set(key, value)
    @settings[[1]] = value
  end
end
Drag options to blanks, or click blank then click option'
Avalue
Bkey.to_s
Ckey.to_sym
Dself
Attempts:
3 left
💡 Hint
Common Mistakes
Using key.to_s may cause inconsistency if keys are symbols elsewhere.
Using value as a key is incorrect.
4fill in blank
hard

Fill both blanks to create a DSL method that stores a block and later calls it with instance_eval.

Ruby
class Builder
  def initialize
    @block = nil
  end

  def define(&[1])
    @block = [2]
  end

  def run
    instance_eval(&@block)
  end
end
Drag options to blanks, or click blank then click option'
Ablock
Bproc
Dlambda
Attempts:
3 left
💡 Hint
Common Mistakes
Using different names for the block parameter and the stored variable causes errors.
Using proc or lambda without defining them causes errors.
5fill in blank
hard

Fill all three blanks to create a DSL method that builds a hash from keys and values with a condition.

Ruby
def build_hash(items)
  result = { [1] => [2] for [3] in items if [2].length > 3 }
  result
end
Drag options to blanks, or click blank then click option'
Aitem
Bvalue
Ckey
Dk
Attempts:
3 left
💡 Hint
Common Mistakes
Using the same variable name for key and value causes confusion.
Not matching the variable names in the condition causes errors.

Practice

(1/5)
1. What is the main purpose of using a DSL (Domain Specific Language) in Ruby?
easy
A. To make code easier to read and write for specific tasks
B. To speed up Ruby interpreter execution
C. To replace Ruby's core syntax completely
D. To automatically generate user interfaces

Solution

  1. Step 1: Understand DSL purpose

    A DSL is designed to simplify and clarify code for a specific domain or task.
  2. Step 2: Compare options

    Only To make code easier to read and write for specific tasks correctly states the purpose of DSLs; others describe unrelated goals.
  3. Final Answer:

    To make code easier to read and write for specific tasks -> Option A
  4. Quick Check:

    DSL purpose = simplify domain code [OK]
Hint: DSLs focus on specific tasks for clearer code [OK]
Common Mistakes:
  • Thinking DSLs speed up Ruby interpreter
  • Believing DSLs replace Ruby syntax entirely
  • Confusing DSLs with UI generators
2. Which Ruby method is commonly used to execute a block inside the context of a DSL object?
easy
A. eval_block
B. block_exec
C. class_eval
D. instance_eval

Solution

  1. Step 1: Recall Ruby block execution methods

    Ruby provides methods like instance_eval and class_eval to run blocks in specific contexts.
  2. Step 2: Identify the method for DSL context

    instance_eval runs the block inside the instance's context, which is typical for DSLs.
  3. Final Answer:

    instance_eval -> Option D
  4. Quick Check:

    Block runs in object context = instance_eval [OK]
Hint: Use instance_eval to run blocks inside DSL objects [OK]
Common Mistakes:
  • Confusing class_eval with instance_eval
  • Using non-existent methods like eval_block
  • Assuming block_exec is a Ruby method
3. What will be the output of this Ruby DSL code?
class Builder
  def initialize
    @steps = []
  end
  def step(name)
    @steps << name
  end
  def build(&block)
    instance_eval(&block)
    @steps
  end
end

b = Builder.new
result = b.build do
  step 'clean'
  step 'compile'
  step 'test'
end
puts result.inspect
medium
A. [:clean, :compile, :test]
B. ["clean", "compile", "test"]
C. ["step", "step", "step"]
D. SyntaxError

Solution

  1. Step 1: Understand the Builder class behavior

    The build method runs the block inside the Builder instance, collecting step names as strings in @steps.
  2. Step 2: Trace the block execution

    Each call to step adds the string name to @steps: 'clean', 'compile', 'test'. The build method returns @steps.
  3. Final Answer:

    ["clean", "compile", "test"] -> Option B
  4. Quick Check:

    Collected steps = ["clean", "compile", "test"] [OK]
Hint: instance_eval runs block adding strings to array [OK]
Common Mistakes:
  • Expecting symbols instead of strings
  • Thinking step method returns step name
  • Confusing array contents with method names
4. Identify the error in this DSL builder code:
class Configurator
  def set(name, value)
    @settings ||= {}
    @settings[name] = value
  end
  def configure(&block)
    instance_eval(block)
  end
end

c = Configurator.new
c.configure do
  set :mode, 'fast'
end
medium
A. Wrong argument passing to instance_eval
B. Missing @settings initialization
C. set method missing return value
D. Block not passed to configure method

Solution

  1. Step 1: Check instance_eval usage

    instance_eval expects a block passed with &block, but here it is called as instance_eval(block) without &.
  2. Step 2: Understand correct block passing

    The correct call is instance_eval(&block) to convert the block argument to a block for instance_eval.
  3. Final Answer:

    Wrong argument passing to instance_eval -> Option A
  4. Quick Check:

    Use &block with instance_eval [OK]
Hint: Pass block with & when calling instance_eval [OK]
Common Mistakes:
  • Calling instance_eval without & for block
  • Forgetting to initialize @settings
  • Expecting set to return a value
5. You want to build a Ruby DSL that allows nested configuration like this:
config = Config.new do
  database do
    adapter 'sqlite3'
    pool 5
  end
  cache do
    enabled true
    size 64
  end
end
Which approach best supports this nested DSL pattern?
hard
A. Use global variables to store settings inside blocks
B. Use class variables to share state across blocks
C. Use instance_eval with separate classes for database and cache blocks
D. Use eval with string interpolation for nested blocks

Solution

  1. Step 1: Understand nested DSL needs

    Nested blocks require separate context objects for database and cache to hold their settings.
  2. Step 2: Identify best practice

    Using instance_eval on separate classes for each nested block cleanly isolates configuration and supports nested DSL.
  3. Final Answer:

    Use instance_eval with separate classes for database and cache blocks -> Option C
  4. Quick Check:

    Nested DSL = instance_eval + separate classes [OK]
Hint: Use instance_eval with helper classes for nested blocks [OK]
Common Mistakes:
  • Using global variables causing conflicts
  • Using class variables mixing state
  • Using eval with strings risking security and complexity
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