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