En Ruby, ¿cómo genero una larga cadena de texto repetido?

138

¿Cuál es la mejor manera de generar una cadena larga rápidamente en ruby? Esto funciona, pero es muy lento:

str = ""
length = 100000
(1..length).each {|i| str += "0"}

También he notado que crear una cadena de una longitud decente y luego agregarla a una cadena existente hasta la longitud deseada funciona mucho más rápido:

str = ""
incrementor = ""
length = 100000
(1..1000).each {|i| incrementor += "0"}
(1..100).each {|i| str += incrementor}

¿Cualquier otra sugerencia?

Markus Orrelly
fuente
1
La mejor manera sería usar JRuby y usar StringBuffer. Oooooh
Jonathan Feinberg

Respuestas:

307
str = "0" * 999999
FMc
fuente
22
De hecho, muy raro, mira qué diferente y elegante se ve en Python str = "0" * 999999
:;
1
¿Por qué es importante el orden con Ruby? Cuando lo hago 99999 * "0"me saleTypeError: String can't be coerced into Fixnum
Steven
16
@Steven Desde la perspectiva de Ruby, "0" * 999999se trata como "0".*(999999)donde *es un método en el Stringclase. Ese método acepta números como argumentos válidos para realizar la replicación de cadenas. Cuando inviertes la expresión, obtenemos 999999.*("0"). Ahora estamos hablando del *método en la FixNumclase, y ese método se niega a tomar cadenas como argumentos. Ciertamente podría (por ejemplo, automáticamente haciendo un mejor esfuerzo para convertir el argumento en un FixNum), pero los diseñadores del lenguaje decidieron no aceptar las inspiraciones de Ruby's Perlish demasiado completamente.
FMc
11

Otra opción relativamente rápida es

str = '%0999999d' % 0

Aunque el benchmarking

require 'benchmark'
Benchmark.bm(9)  do |x|
  x.report('format  :') { '%099999999d' % 0 }
  x.report('multiply:') { '0' * 99999999 }
end

Muestra que la multiplicación es aún más rápida.

               user     system      total        real
format  :  0.300000   0.080000   0.380000 (  0.405345)
multiply:  0.080000   0.080000   0.160000 (  0.172504)
rampion
fuente
Me gusta esta respuesta, pero parece que no puedo hacer que funcione para nada más que '0'. ¿Qué hago si quiero 100 r?
yourdeveloperfriend
2
No funcionará con otros símbolos porque aprovecha el relleno de números en las cadenas de formato. Los números se pueden rellenar con 0 al frente o atrás (para decimales) sin cambiar el valor, los r no funcionan así.
Andrew