Bird
Raised Fist0
Rubyprogramming~5 mins

Closures and variable binding in Ruby - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a closure in Ruby?
A closure is a block, proc, or lambda that captures variables from its surrounding context, allowing it to access those variables even when executed outside that context.
Click to reveal answer
intermediate
How does variable binding work inside a Ruby closure?
Variables used inside a closure capture the variables from the surrounding scope by reference, so the closure sees their updated values even if the variables change later.
Click to reveal answer
intermediate
What is the difference between a Proc and a lambda in Ruby closures?
Both are closures, but lambdas check the number of arguments and return control to the calling method, while Procs are more lenient with arguments and return from the enclosing context.
Click to reveal answer
advanced
Explain with an example how a closure can remember a variable's value after the variable changes.
Example:
x = 10
closure = -> { x }
x = 20
closure.call # returns 20 because closure captures variable by reference, not by value.
Click to reveal answer
beginner
Why are closures useful in Ruby programming?
Closures let you write flexible code by capturing context, enabling callbacks, delayed execution, and maintaining state without global variables.
Click to reveal answer
What does a Ruby closure capture from its surrounding environment?
AOnly global variables
BVariables and their current values
COnly method names
DNothing, closures have no context
In Ruby, what happens if you change a variable after creating a closure that uses it?
AThe closure breaks and raises an error
BThe closure keeps the old value forever
CThe closure sees the updated variable value
DThe closure ignores the variable
Which Ruby closure type checks the number of arguments strictly?
ALambda
BProc
CBlock
DMethod
What is a common use case for closures in Ruby?
ATo create global variables
BTo perform file I/O
CTo define classes
DTo delay execution and maintain state
Which of these is NOT a closure in Ruby?
AClass
BProc
CLambda
DBlock
Explain what a closure is in Ruby and how it handles variable binding.
Think about how blocks or lambdas remember variables from outside.
You got /4 concepts.
    Describe the difference between a Proc and a lambda in Ruby closures.
    Focus on argument checking and return behavior.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is a closure in Ruby?
      easy
      A. A variable that changes its value automatically
      B. A method that can only be called once
      C. A function that remembers variables from its creation context
      D. A class that cannot be inherited

      Solution

      1. Step 1: Understand the definition of closure

        A closure is a function or block that keeps access to variables from where it was created, even if called later.
      2. Step 2: Match the definition to options

        A function that remembers variables from its creation context correctly describes this behavior. Other options describe unrelated concepts.
      3. Final Answer:

        A function that remembers variables from its creation context -> Option C
      4. Quick Check:

        Closure = function remembering variables [OK]
      Hint: Closures remember variables where they were made [OK]
      Common Mistakes:
      • Thinking closures are just methods
      • Confusing closures with classes
      • Believing closures change variable values automatically
      2. Which of the following is the correct way to create a closure using a lambda in Ruby?
      easy
      A. closure = lambda { |x| x * 2 }
      B. closure = def(x) x * 2 end
      C. closure = function(x) { x * 2 }
      D. closure = -> x x * 2

      Solution

      1. Step 1: Identify Ruby lambda syntax

        In Ruby, lambdas can be created with lambda { |args| ... } or ->(args) { ... }.
      2. Step 2: Check each option

        closure = lambda { |x| x * 2 } uses lambda { |x| x * 2 }, which is valid. closure = def(x) x * 2 end uses invalid syntax for a lambda. closure = function(x) { x * 2 } uses JavaScript-like syntax. closure = -> x x * 2 misses parentheses in the arrow syntax, which is invalid.
      3. Final Answer:

        closure = lambda { |x| x * 2 } -> Option A
      4. Quick Check:

        Correct lambda syntax = closure = lambda { |x| x * 2 } [OK]
      Hint: Use lambda { |args| ... } for Ruby closures [OK]
      Common Mistakes:
      • Using JavaScript or Python syntax
      • Omitting parentheses in arrow lambdas
      • Trying to define lambdas with def keyword
      3. What will be the output of this Ruby code?
      def make_closures
        closures = []
        3.times do |i|
          closures << lambda { i }
        end
        closures
      end
      
      closures = make_closures
      closures.each { |c| puts c.call }
      medium
      A. 2 2 2
      B. 0 1 2
      C. 0 0 0
      D. Error: undefined variable i

      Solution

      1. Step 1: Understand variable binding in block

        Ruby lambdas capture block variables like i by value in this context, so each lambda remembers its own i value.
      2. Step 2: Evaluate each lambda call

        The loop sets i to 0, 1, 2 sequentially. Each lambda captures the current i value, so outputs are 0, 1, 2 respectively.
      3. Final Answer:

        0 1 2 -> Option B
      4. Quick Check:

        Lambdas capture distinct values per iteration [OK]
      Hint: Ruby block vars in closures captured by value per iteration [OK]
      Common Mistakes:
      • Thinking lambdas capture shared variable (all 2)
      • Thinking last value is 3 (off-by-one)
      • Expecting error or all zeros
      4. Find the error in this Ruby code that tries to create closures:
      closures = []
      3.times do |i|
        closures << lambda { j }
        j = i
      end
      closures.each { |c| puts c.call }
      medium
      A. Variable j is used before assignment inside the lambda
      B. Lambda syntax is incorrect
      C. times method cannot be used with blocks
      D. closures array is not initialized

      Solution

      1. Step 1: Identify variable usage inside lambda

        The lambda uses variable j before it is assigned any value in the block, causing an error when called.
      2. Step 2: Understand variable binding timing

        Since j is assigned after lambda creation, the lambda captures j as nil or undefined at call time, causing an error.
      3. Final Answer:

        Variable j is used before assignment inside the lambda -> Option A
      4. Quick Check:

        Use variables after assignment in closures [OK]
      Hint: Assign variables before using them in closures [OK]
      Common Mistakes:
      • Assuming lambda syntax is wrong
      • Thinking times method is invalid
      • Ignoring variable initialization order
      5. How can you modify this Ruby code to create closures that each remember a different value of i even if i changes later?
      closures = []
      3.times do |i|
        closures << lambda { i }
      end
      closures.each { |c| puts c.call }
      hard
      A. Call closures inside the times block
      B. Change lambda to proc
      C. Use global variable $i instead of i
      D. Use a local variable inside the block to capture i: val = i; closures << lambda { val }

      Solution

      1. Step 1: Understand variable capture in closures

        Closures capture variables by reference, so if i changes later, all lambdas see the last value.
      2. Step 2: Use a local variable to capture current value

        Assign val = i inside the block, then create lambda using val. This captures the value at that iteration.
      3. Final Answer:

        Use a local variable inside the block to capture i: val = i; closures << lambda { val } -> Option D
      4. Quick Check:

        Capture current value with local variable [OK]
      Hint: Assign loop variable to local var inside block for closure [OK]
      Common Mistakes:
      • Thinking proc changes variable capture behavior
      • Using global variables which share state
      • Calling closures too early inside loop
      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