No Ruby, como faço para gerar uma longa sequência de texto repetido?

138

Qual é a melhor maneira de gerar uma cadeia longa rapidamente em ruby? Isso funciona, mas é muito lento:

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

Também notei que criar uma sequência de tamanho decente e anexá-la a uma sequência existente até o comprimento desejado funciona muito mais rápido:

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

Alguma outra sugestão?

Markus Orrelly
fonte
1
A melhor maneira seria usar o JRuby e o StringBuffer. Oooooh.
Jonathan Feinberg

Respostas:

307
str = "0" * 999999
FMc
fonte
22
Na verdade, muito estranho, olhar como diferentes e elegantes Looks no Python: str = "0" * 999999;)
tokland
1
Por que o pedido é importante com Ruby? Quando eu 99999 * "0"receboTypeError: String can't be coerced into Fixnum
Steven
16
@ Steven Do ponto de vista de Ruby, "0" * 999999é tratado como "0".*(999999)onde *é um método na Stringclasse. Esse método aceita números como argumentos válidos para executar a replicação de string. Quando você inverte a expressão, nós obtemos 999999.*("0"). Agora, estamos falando sobre o *método na FixNumclasse, e esse método se recusa a aceitar seqüências de caracteres como argumentos. Certamente poderia (por exemplo, fazer o melhor esforço possível para converter o argumento em um FixNum), mas os designers de linguagem decidiram não adotar totalmente as inspirações de Ruby Perlish.
FMc
11

Outra opção relativamente rápida é

str = '%0999999d' % 0

Embora o benchmarking

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

Mostra que a multiplicação ainda é mais 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
fonte
Eu gosto desta resposta, mas não consigo fazê-la funcionar para algo diferente de '0'. O que faço se quiser 100 r?
Yourdeveloperfriend 26/03
2
Ele não funcionará com outros símbolos, pois está aproveitando o preenchimento numérico em cadeias de caracteres de formato. Os números podem ser preenchidos com 0 na frente ou atrás (para decimais) sem alterar o valor, r não funciona assim.
18713 Andrew Andrew