Bird
Raised Fist0
Rubyprogramming~20 mins

Open classes (reopening classes) in Ruby - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Ruby Open Classes Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of reopening a class and adding a method?
Consider the following Ruby code that reopens the String class to add a new method. What will be printed when the code runs?
Ruby
class String
  def shout
    self.upcase + "!"
  end
end

puts "hello".shout
AHELLO!
Bhello!
CError: undefined method 'shout' for String
Dhello
Attempts:
2 left
💡 Hint
Reopening a class allows you to add new methods to existing classes.
❓ Predict Output
intermediate
2:00remaining
What happens when you redefine an existing method in a reopened class?
Look at this Ruby code where the Array class is reopened and the push method is redefined. What will be the output?
Ruby
class Array
  def push(element)
    "Cannot add elements"
  end
end

arr = [1, 2]
puts arr.push(3)
AError: wrong number of arguments for push
B"Cannot add elements"
C[1, 2, 3]
D3
Attempts:
2 left
💡 Hint
Redefining a method replaces the original behavior.
🔧 Debug
advanced
2:00remaining
Why does this reopened class code raise an error?
This code reopens the Integer class to add a method, but it raises an error. What is the cause?
Ruby
class Integer
  def double
    self * 2
  end
end

puts 5.double

class Integer
  def double
    self + 2
  end
end

puts 5.double
AError because Integer is a built-in class and cannot be reopened
BError because method double is defined twice without aliasing
CNo error; outputs 10 then 7
DError because puts is called outside any method
Attempts:
2 left
💡 Hint
Ruby allows reopening built-in classes and redefining methods.
🧠 Conceptual
advanced
2:00remaining
What is a risk of reopening core Ruby classes?
Reopening core Ruby classes like String or Array can be powerful but risky. Which of these is the main risk?
AIt causes Ruby to crash immediately
BIt makes the program run slower because classes are duplicated
CIt prevents you from using built-in methods anymore
DIt can cause conflicts if multiple libraries redefine the same method differently
Attempts:
2 left
💡 Hint
Think about what happens if two pieces of code change the same method.
❓ Predict Output
expert
2:00remaining
What is the output after reopening a class and using super?
Examine this Ruby code where the String class is reopened and the reverse method is redefined using super. What will be printed?
Ruby
class String
  def reverse
    "Reversed: " + super
  end
end

puts "abc".reverse
AReversed: cba
Babc
CError: super called outside method
DReversed: abc
Attempts:
2 left
💡 Hint
super calls the original method from the class before reopening.

Practice

(1/5)
1. What does it mean to reopen a class in Ruby?
easy
A. You write the class again to add or change methods without deleting the original.
B. You create a new class with the same name but different methods.
C. You delete the old class and replace it with a new one.
D. You make a copy of the class and modify the copy only.

Solution

  1. Step 1: Understand Ruby class behavior

    In Ruby, classes are open, meaning you can write the class again to add or change methods.
  2. Step 2: Identify what reopening means

    Reopening a class means modifying the existing class by adding or replacing methods without deleting it.
  3. Final Answer:

    You write the class again to add or change methods without deleting the original. -> Option A
  4. Quick Check:

    Reopen class = add/change methods anytime [OK]
Hint: Reopen means add or change methods by rewriting class [OK]
Common Mistakes:
  • Thinking reopening creates a new separate class
  • Assuming reopening deletes the old class
  • Confusing reopening with copying a class
2. Which of the following is the correct syntax to reopen the String class and add a method shout that returns the string in uppercase with exclamation?
easy
A. class String def shout self.upcase + "!" end end
B. def String.shout self.upcase + "!" end
C. class String def shout upcase! end end
D. class String def shout self + "!" end end

Solution

  1. Step 1: Check class reopening syntax

    To reopen a class, write class ClassName again and define methods inside.
  2. Step 2: Verify method definition and behavior

    Method shout should return uppercase string plus exclamation, so self.upcase + "!" is correct.
  3. Final Answer:

    class String def shout self.upcase + "!" end end -> Option A
  4. Quick Check:

    Reopen class + define method correctly = class String def shout self.upcase + "!" end end [OK]
Hint: Use class name again and define method inside [OK]
Common Mistakes:
  • Defining method outside class
  • Using destructive method like upcase! which changes string
  • Not returning uppercase string with exclamation
3. What will be the output of this Ruby code?
class Array
  def first_two
    self[0..1]
  end
end

arr = [10, 20, 30, 40]
puts arr.first_two.inspect
medium
A. [10]
B. [10, 20]
C. [20, 30]
D. nil

Solution

  1. Step 1: Understand method added to Array

    The method first_two returns elements at index 0 and 1 using self[0..1].
  2. Step 2: Apply method on given array

    Array is [10, 20, 30, 40], so first_two returns [10, 20].
  3. Final Answer:

    [10, 20] -> Option B
  4. Quick Check:

    Array slice 0..1 = first two elements [OK]
Hint: Slice array 0..1 to get first two elements [OK]
Common Mistakes:
  • Confusing index ranges and getting wrong slice
  • Expecting single element instead of array
  • Thinking method returns nil
4. This code tries to reopen the Integer class to add a method double. What is wrong?
class Integer
  def double
    self * 2
  end
end

puts 5.double()
medium
A. Method double should be defined as a class method, not instance method.
B. You cannot reopen built-in classes like Integer.
C. Nothing is wrong; it will print 10.
D. The method double uses wrong syntax for multiplication.

Solution

  1. Step 1: Check if reopening Integer is allowed

    Ruby allows reopening built-in classes like Integer to add instance methods.
  2. Step 2: Verify method and usage

    Method double multiplies self by 2, and calling 5.double() returns 10.
  3. Final Answer:

    Nothing is wrong; it will print 10. -> Option C
  4. Quick Check:

    Reopen Integer + instance method works = 10 output [OK]
Hint: Reopen built-in classes freely; instance methods work [OK]
Common Mistakes:
  • Thinking built-in classes cannot be reopened
  • Confusing instance and class methods
  • Assuming syntax error in multiplication
5. You want to reopen the Hash class to add a method symbolize_keys that returns a new hash with all string keys converted to symbols. Which code correctly does this?
hard
A. class Hash def symbolize_keys each_with_object({}) do |(k, v), h| h[k.to_sym] = v end end end
B. class Hash def symbolize_keys map { |k, v| [k.to_sym, v] } end end
C. class Hash def symbolize_keys keys.map(&:to_sym) end end
D. class Hash def symbolize_keys self.transform_keys(&:to_sym) end end

Solution

  1. Step 1: Understand the goal

    We want a method that returns a new hash with string keys converted to symbols.
  2. Step 2: Check each option's correctness

    class Hash def symbolize_keys each_with_object({}) do |(k, v), h| h[k.to_sym] = v end end end manually builds a new hash but misses handling non-string keys safely. class Hash def symbolize_keys map { |k, v| [k.to_sym, v] } end end returns an array, not a hash. class Hash def symbolize_keys keys.map(&:to_sym) end end returns only keys as symbols, not a hash. class Hash def symbolize_keys self.transform_keys(&:to_sym) end end uses transform_keys(&:to_sym), a built-in method that correctly returns a new hash with symbol keys.
  3. Final Answer:

    class Hash def symbolize_keys self.transform_keys(&:to_sym) end end -> Option D
  4. Quick Check:

    Use transform_keys(&:to_sym) for symbol keys [OK]
Hint: Use transform_keys(&:to_sym) to convert keys easily [OK]
Common Mistakes:
  • Returning array instead of hash
  • Not returning a new hash
  • Ignoring keys that are not strings
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