RubyIntermedio2 nov 2025

¡La Multiplicación de Arrays en Ruby Es Más Tramposa de lo Que Parece!

snippet.ruby
original_array = [[]]
multiplied_array = original_array * 3
multiplied_array[0] << "Oops!"
puts multiplied_array.inspect

¿Qué crees que imprime?

Salida Esperada

[["Oops!"], [], []]

⚠️ Salida Real

[["Oops!"], ["Oops!"], ["Oops!"]]

¿Por qué pasa esto?

¡Qué pasa aquí, Ruby! 🤯 Uno esperaría que al multiplicar un array `[[]]` por 3, obtendríamos tres arrays internos **independientes**. Pero no, Ruby tiene sus propias reglas para esta fiesta: ¡es una **copia superficial**! 🕺 Imagina que tienes una caja de juguetes `original_array` y dentro solo hay un perrito 🐶. Cuando dices `original_array * 3`, no estás creando tres cajas con tres perritos nuevos y únicos. ¡Estás creando tres cajas, y cada una tiene una **referencia al MISMO perrito**! Si le pones un sombrerito a ese perrito en una de las cajas (`multiplied_array[0] << "Oops!"`), ¡sorpresa! Todas las cajas muestran al perrito con el mismo sombrerito. 🎩🐕 Ruby duplica la **referencia al objeto interno**, no el objeto en sí. Para una copia "profunda" (deep copy), tendrías que clonar cada elemento individualmente.

Conceptos relacionados

referencesshallow-copyarray-multiplication