Bird
Raised Fist0
Rubyprogramming~20 mins

Bang methods (ending with !) in Ruby - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Ruby Bang Methods 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 this Ruby code using a bang method?
Consider the following Ruby code snippet. What will be printed?
Ruby
arr = [1, 2, 3]
arr.reverse!
puts arr.inspect
Anil
B[1, 2, 3]
CError: undefined method 'reverse!'
D[3, 2, 1]
Attempts:
2 left
💡 Hint
Bang methods usually modify the object itself.
❓ Predict Output
intermediate
2:00remaining
What does this string bang method return?
What will be the output of this Ruby code?
Ruby
str = "hello"
result = str.upcase!
puts result
puts str
A
nil
hello
B
HELLO
hello
C
HELLO
HELLO
DError: undefined method 'upcase!'
Attempts:
2 left
💡 Hint
upcase! changes the string itself and returns the modified string.
❓ Predict Output
advanced
2:00remaining
What is the output when bang method does not change the object?
Look at this Ruby code. What will be printed?
Ruby
arr = [1, 2, 3]
result = arr.sort!
puts result.inspect
puts arr.inspect
A
nil
[1, 2, 3]
B
[1, 2, 3]
[1, 2, 3]
C
[3, 2, 1]
[3, 2, 1]
DError: undefined method 'sort!'
Attempts:
2 left
💡 Hint
Bang methods return nil if no changes were made.
❓ Predict Output
advanced
2:00remaining
What error does this code raise?
What error will this Ruby code produce?
Ruby
num = 10
num.negate!
ANoMethodError: undefined method 'negate!' for 10:Integer
BSyntaxError: unexpected '!'
CTypeError: can't convert Integer to String
DRuntimeError: method negate! failed
Attempts:
2 left
💡 Hint
Check if Integer has a negate! method.
🧠 Conceptual
expert
2:00remaining
Why do Ruby bang methods sometimes return nil?
In Ruby, some bang methods return nil instead of the modified object. Why does this happen?
ABecause the method always returns nil by design
BBecause the method did not make any changes to the object
CBecause the object is frozen and cannot be changed
DBecause the method encountered an error during execution
Attempts:
2 left
💡 Hint
Think about what happens if the object is already in the desired state.

Practice

(1/5)
1. What is the main difference between a bang method (ending with !) and its non-bang counterpart in Ruby?
easy
A. Bang methods are slower than non-bang methods
B. Bang methods always return nil, non-bang methods return the object
C. Bang methods can only be used with strings
D. Bang methods modify the object itself, non-bang methods return a new object

Solution

  1. Step 1: Understand bang method behavior

    Bang methods (ending with !) usually change the original object directly.
  2. Step 2: Compare with non-bang methods

    Non-bang methods return a new object and leave the original unchanged.
  3. Final Answer:

    Bang methods modify the object itself, non-bang methods return a new object -> Option D
  4. Quick Check:

    Bang method = modifies object [OK]
Hint: Bang methods change the original object, non-bang do not [OK]
Common Mistakes:
  • Thinking bang methods return nil
  • Assuming bang methods only work on strings
  • Believing bang methods are slower
2. Which of the following is the correct syntax to use the bang method that reverses a string in Ruby?
easy
A. str.reverse!
B. str.reverse
C. str!reverse
D. reverse.str!

Solution

  1. Step 1: Recall Ruby method syntax

    Methods are called on objects using dot notation: object.method.
  2. Step 2: Identify the bang method for reversing

    The bang method for reversing a string is reverse!, so the correct call is str.reverse!.
  3. Final Answer:

    str.reverse! -> Option A
  4. Quick Check:

    Correct bang method syntax = str.reverse! [OK]
Hint: Bang methods use dot notation with ! at the end [OK]
Common Mistakes:
  • Placing ! before method name
  • Using wrong method call order
  • Omitting the dot between object and method
3. What will be the output of the following Ruby code?
arr = [1, 2, 3]
arr.reverse
puts arr.inspect
arr.reverse!
puts arr.inspect
medium
A. [1, 2, 3]\n[3, 2, 1]
B. [3, 2, 1]\n[1, 2, 3]
C. [1, 2, 3]\n[1, 2, 3]
D. [3, 2, 1]\n[3, 2, 1]

Solution

  1. Step 1: Understand arr.reverse effect

    arr.reverse returns a new reversed array but does not change arr itself, so arr.inspect prints the original: [1, 2, 3].
  2. Step 2: Understand arr.reverse! effect

    arr.reverse! reverses arr in place, changing it to [3, 2, 1]. So the second print shows [3, 2, 1].
  3. Final Answer:

    [1, 2, 3] [3, 2, 1] -> Option A
  4. Quick Check:

    Non-bang no change, bang changes object [OK]
Hint: Non-bang returns new object; bang changes original [OK]
Common Mistakes:
  • Assuming reverse changes original array
  • Confusing output order
  • Ignoring bang method effect
4. Consider this Ruby code snippet:
str = "Hello"
str.upcase
puts str
str.upcase!
puts str
What is the error in this code?
medium
A. No error; output is "HELLO" then "HELLO"
B. puts cannot print strings
C. Calling upcase without assignment does not change str
D. upcase! method does not exist

Solution

  1. Step 1: Analyze str.upcase call

    str.upcase returns an uppercase string but does not change str itself unless assigned.
  2. Step 2: Analyze str.upcase! call

    str.upcase! modifies str in place, changing it to uppercase.
  3. Final Answer:

    Calling upcase without assignment does not change str -> Option C
  4. Quick Check:

    Non-bang needs assignment to change object [OK]
Hint: Non-bang methods need assignment to change variable [OK]
Common Mistakes:
  • Thinking non-bang changes original string
  • Believing upcase! does not exist
  • Assuming puts can't print strings
5. You have an array of strings: words = ["apple", "banana", "Cherry"]. You want to convert all words to lowercase, modifying the original array directly. Which code correctly does this using bang methods?
hard
A. words.map { |w| w.downcase }
B. words.each { |w| w.downcase! }
C. words.each { |w| w.downcase }
D. words.map! { |w| w.downcase! }

Solution

  1. Step 1: Understand requirement to modify original array

    We want to change each string inside words directly, not create a new array.
  2. Step 2: Analyze each option

    • words.map! { |w| w.downcase! } uses map! with downcase!, but downcase! returns nil if no change, causing words to have nils.
    • words.map { |w| w.downcase } returns a new array, does not modify original.
    • words.each { |w| w.downcase } calls downcase but does not assign, so no change.
    • words.each { |w| w.downcase! } uses each with downcase!, modifying each string in place correctly.
  3. Final Answer:

    words.each { |w| w.downcase! } -> Option B
  4. Quick Check:

    Use each with bang method to modify elements [OK]
Hint: Use each with bang method to change elements in place [OK]
Common Mistakes:
  • Using map! with downcase! causing nils
  • Using non-bang methods without assignment
  • Using map without modifying original array
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