Obtengo un valor de retorno inesperado con este código:
str = ''; 'abc'.chars.map {|c| str<<c}Rendimiento esperado:
["a", "ab", "abc"]Salida real:
["abc", "abc", "abc"] Agregando puts(str) para la depuración:
str = ''; 'abc'.chars.map {|c| puts(str); str<<c} a ab => ["abc", "abc", "abc"]¿Por qué el código anterior no devuelve el resultado esperado? Gracias.
Del manual fino :
cadena << objeto → cadena .
Concatenaobjectaselfy devuelveself
Entonces str << c en el bloque altera str y luego el bloque mismo se evalúa como str .
Podrías decir esto para obtener los resultados que buscas:
str = '' 'abc'.chars.map { |c| (str << c).dup }Es porque cada elemento en su mapa devuelve una referencia al valor de str , no al valor real de str . Entonces, su mapa devuelve 3 referencias al valor de str y no al valor de str en el momento de la iteración; porque cada referencia a str apunta a un lugar en la memoria al final que tiene 'abc' , por eso ves el valor final de str 3 veces.