RubyIntermedio16 oct 2025

El Misterio de los Paréntesis de super: ¡Tus Argumentos Desaparecen!

snippet.ruby
class Parent
  def say_hello(name="Anonymous")
    "Parent says: Hello, #{name}!"
  end
end

class ChildImplicitSuper < Parent
  def say_hello(name)
    super # Calls Parent#say_hello with 'name'
  end
end

class ChildExplicitEmptySuper < Parent
  def say_hello(name)
    super() # Calls Parent#say_hello with NO arguments
  end
end

puts "ChildImplicitSuper('Alice'):"
puts ChildImplicitSuper.new.say_hello("Alice")

puts "\nChildExplicitEmptySuper('Bob'):"
puts ChildExplicitEmptySuper.new.say_hello("Bob")

¿Qué crees que imprime?

Salida Esperada

ChildImplicitSuper('Alice'):
Parent says: Hello, Alice!

ChildExplicitEmptySuper('Bob'):
Parent says: Hello, Bob!

⚠️ Salida Real

ChildImplicitSuper('Alice'):
Parent says: Hello, Alice!

ChildExplicitEmptySuper('Bob'):
Parent says: Hello, Anonymous!

¿Por qué pasa esto?

**Ruby es un caballero muy peculiar** cuando le pides que hable con sus padres. Conoce el modismo "¡Ve a ver a tu padre!" 👨‍👦 Cuando usas `super` **sin paréntesis**, Ruby es como ese hijo obediente y responsable: ¡automáticamente **recoge todos los argumentos** que le pasaste a la versión del hijo y se los entrega a la versión del padre! "Aquí tienes, papá, todo lo que me dieron a mí". 🙌 Pero si le pides `super()`, ¡ahí cambia la cosa! Es como si le dijeras: "¡Ve a ver a tu padre, pero **no le pases NADA**!" 🤐 Ruby interpreta los paréntesis vacíos como una instrucción explícita de **no pasar argumentos**, ignorando por completo los que tenías en la mano. Tu `name` ("Bob") se queda en el limbo, y el método padre `say_hello` usa su valor por defecto ("Anonymous"). ¡Zas! 💥 Es una distinción sutil pero brutal: `super` = "pasa mis argumentos", `super()` = "¡no pases ningún argumento!". Un pequeño detalle sintáctico con un impacto gigantesco. ¡Cuidado con esos paréntesis! 🕵️‍♀️

Conceptos relacionados

inheritanceargument-passingsyntactic-sugar