Bird
Raised Fist0
Rubyprogramming~20 mins

Why functional patterns complement OOP in Ruby - Challenge Your Understanding

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Functional OOP Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of combining functional and OOP styles
What is the output of this Ruby code that mixes functional style with OOP?
Ruby
class Calculator
  def initialize(numbers)
    @numbers = numbers
  end

  def double_and_sum
    @numbers.map { |n| n * 2 }.reduce(0, :+)
  end
end

calc = Calculator.new([1, 2, 3])
puts calc.double_and_sum
A6
B9
CError: undefined method `map' for Integer
D12
Attempts:
2 left
💡 Hint
Think about how map and reduce work on arrays inside the class.
🧠 Conceptual
intermediate
1:30remaining
Why use functional patterns in OOP?
Which reason best explains why functional programming patterns complement object-oriented programming?
AThey help manage side effects and make code easier to test.
BThey replace the need for classes and objects entirely.
CThey force all data to be mutable for flexibility.
DThey make code run faster by avoiding objects.
Attempts:
2 left
💡 Hint
Think about how pure functions behave compared to methods with side effects.
🔧 Debug
advanced
2:00remaining
Identify the error mixing functional and OOP styles
What error does this Ruby code produce when mixing functional and OOP styles?
Ruby
class DataProcessor
  def initialize(data)
    @data = data
  end

  def process
    @data.map! { |x| x * 2 }
    @data.reduce(:+)
  end
end

processor = DataProcessor.new(10)
puts processor.process
ANoMethodError: undefined method `map!' for Integer
BTypeError: no implicit conversion of Integer into Array
CSyntaxError: unexpected end-of-input
DNilClass error when calling reduce
Attempts:
2 left
💡 Hint
Check the type of @data when calling map! inside the class.
📝 Syntax
advanced
2:00remaining
Correct functional method syntax in OOP context
Which option correctly defines a method in Ruby that uses a functional style inside a class?
Ruby
class Transformer
  def initialize(values)
    @values = values
  end

  def transform
    # Fill in the blank
  end
end
A
def transform
  @values.reduce { |sum, v| sum + v + 1 }
end
B
def transform
  @values.map { |v| v + 1 }
end
C
def transform
  @values.map! { |v| v + 1 }
end
D
def transform
  @values.each { |v| v + 1 }
end
Attempts:
2 left
💡 Hint
Functional style prefers returning new collections without modifying originals.
🚀 Application
expert
3:00remaining
Predict the final output combining OOP and functional methods
Given this Ruby code combining OOP and functional patterns, what is the final output?
Ruby
class Stats
  def initialize(numbers)
    @numbers = numbers
  end

  def mean
    @numbers.reduce(0.0, :+) / @numbers.size
  end

  def squared_diffs
    @numbers.map { |n| (n - mean) ** 2 }
  end

  def variance
    squared_diffs.reduce(0.0, :+) / @numbers.size
  end
end

stats = Stats.new([2, 4, 4, 4, 5, 5, 7, 9])
puts stats.variance.round(2)
A3.5
B2.0
C4.0
D5.0
Attempts:
2 left
💡 Hint
Calculate mean first, then squared differences, then average those.

Practice

(1/5)
1. Which of the following best explains why functional patterns complement Object-Oriented Programming (OOP) in Ruby?
easy
A. Functional patterns make Ruby code run faster by avoiding objects.
B. Functional patterns replace the need for classes and objects entirely.
C. OOP discourages the use of methods and focuses only on data.
D. Functional patterns create small, reusable methods without side effects, improving code clarity.

Solution

  1. Step 1: Understand functional patterns in Ruby

    Functional patterns emphasize small, reusable methods that avoid changing data outside their scope (no side effects).
  2. Step 2: Understand OOP's role

    OOP organizes code around objects that combine data and behavior, making programs easier to manage.
  3. Final Answer:

    Functional patterns create small, reusable methods without side effects, improving code clarity. -> Option D
  4. Quick Check:

    Functional patterns improve clarity by avoiding side effects [OK]
Hint: Functional = small, pure methods; OOP = objects with data [OK]
Common Mistakes:
  • Thinking functional replaces OOP completely
  • Believing OOP ignores methods
  • Assuming functional always makes code faster
2. Which Ruby syntax correctly defines a pure function that doubles a number without changing any external state?
easy
A. def double(x); x * 2; end
B. def double(x); @value = x * 2; end
C. def double(x); puts x * 2; end
D. def double(x); x *= 2; nil; end

Solution

  1. Step 1: Identify pure function characteristics

    A pure function returns a value based only on input and does not change external variables or produce side effects.
  2. Step 2: Check each option

    def double(x); x * 2; end returns x * 2 without changing anything else. def double(x); @value = x * 2; end changes an instance variable (@value), so it has side effects. def double(x); puts x * 2; end prints output (side effect). def double(x); x *= 2; nil; end modifies x locally but returns nil, so it doesn't return the doubled value.
  3. Final Answer:

    def double(x); x * 2; end -> Option A
  4. Quick Check:

    Pure function returns value only [OK]
Hint: Pure functions return values without side effects [OK]
Common Mistakes:
  • Using instance variables inside pure functions
  • Printing inside functions instead of returning
  • Not returning the computed value explicitly
3. What is the output of this Ruby code combining OOP and functional style?
class Calculator
  def initialize(value)
    @value = value
  end

  def double
    @value * 2
  end

  def apply(func)
    func.call(@value)
  end
end

calc = Calculator.new(5)
puts calc.double
puts calc.apply(->(x) { x + 3 })
medium
A. 10 8
B. 10 15
C. 5 8
D. Error: undefined method

Solution

  1. Step 1: Understand the Calculator class methods

    The double method returns @value * 2, so for 5 it returns 10. The apply method calls the passed function with @value.
  2. Step 2: Evaluate the output of puts statements

    calc.double prints 10. calc.apply calls the lambda adding 3 to 5, so prints 8.
  3. Final Answer:

    10 8 -> Option A
  4. Quick Check:

    double = 10, apply adds 3 = 8 [OK]
Hint: Remember lambdas called with .call and return values [OK]
Common Mistakes:
  • Confusing lambda call syntax
  • Expecting apply to modify @value
  • Mixing up output values
4. Identify the error in this Ruby code that tries to combine functional and OOP styles:
class Counter
  def initialize
    @count = 0
  end

  def increment
    @count += 1
  end

  def apply(func)
    func(@count)
  end
end

counter = Counter.new
counter.increment
puts counter.apply(->(x) { x * 2 })
medium
A. Lambda syntax is incorrect
B. increment method should return @count
C. func should be called with .call, not func()
D. Instance variable @count is not initialized

Solution

  1. Step 1: Check how func is used in apply method

    In Ruby, to call a lambda or Proc, you must use .call, not func().
  2. Step 2: Identify the error

    func(@count) will cause a NoMethodError because func is a Proc object and needs .call.
  3. Final Answer:

    func should be called with .call, not func() -> Option C
  4. Quick Check:

    Call lambdas with .call [OK]
Hint: Use .call to invoke lambdas or Procs [OK]
Common Mistakes:
  • Calling lambda like a normal method
  • Forgetting to initialize instance variables
  • Incorrect lambda syntax
5. You want to create a Ruby class that stores a list of numbers and provides a method to return a new list with each number doubled, without changing the original list. Which approach best combines functional patterns with OOP?
hard
A. Modify the original list inside the method by doubling each element in place.
B. Define a method that returns a new array using map without modifying the original list.
C. Store the doubled values in an instance variable and return it directly.
D. Use a global variable to hold the doubled list and update it inside the method.

Solution

  1. Step 1: Understand the requirement

    The method should not change the original list but return a new list with doubled values.
  2. Step 2: Evaluate options for functional and OOP style

    Using map returns a new array without side effects, fitting functional style. Modifying original data or using global variables breaks this principle.
  3. Final Answer:

    Define a method that returns a new array using map without modifying the original list. -> Option B
  4. Quick Check:

    Use map for new array, avoid side effects [OK]
Hint: Use map to transform arrays without changing originals [OK]
Common Mistakes:
  • Modifying original array instead of returning new
  • Using global variables for data storage
  • Storing results in instance variables unnecessarily
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