In Ruby come posso generare una lunga stringa di testo ripetuto?


138

Qual è il modo migliore per generare rapidamente una lunga stringa in rubino? Funziona, ma è molto lento:

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

Ho anche notato che la creazione di una stringa di una lunghezza decente e quindi l'aggiunta a una stringa esistente fino alla lunghezza desiderata funziona molto più velocemente:

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

Altri suggerimenti?


1
Il modo migliore sarebbe usare JRuby e usare StringBuffer. Oooooh.
Jonathan Feinberg,

Risposte:


307
str = "0" * 999999

22
Anzi, molto strano, guarda come appare diverso ed elegante in Python str = "0" * 999999
:;

1
Perché l'ordine è importante con Ruby? Quando lo faccio 99999 * "0"ricevoTypeError: String can't be coerced into Fixnum
Steven il

16
@Steven Dal punto di vista di Ruby, "0" * 999999viene trattato come "0".*(999999)dove si *trova un metodo nella Stringclasse. Tale metodo accetta numeri come argomenti validi per eseguire la replica di stringhe. Quando inverti l'espressione, otteniamo 999999.*("0"). Ora stiamo parlando del *metodo nella FixNumclasse e quel metodo rifiuta di prendere le stringhe come argomenti. Certamente potrebbe (ad esempio, fare automaticamente il massimo sforzo per convertire l'argomento in FixNum) ma i progettisti del linguaggio hanno deciso di non abbracciare troppo pienamente le ispirazioni di Perlish di Ruby.
FMc,

11

Un'altra opzione relativamente veloce è

str = '%0999999d' % 0

Sebbene benchmarking

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

Mostra che la moltiplicazione è ancora più veloce

               user     system      total        real
format  :  0.300000   0.080000   0.380000 (  0.405345)
multiply:  0.080000   0.080000   0.160000 (  0.172504)

Mi piace questa risposta, ma non riesco a farlo funzionare per qualcosa di diverso da "0". Cosa devo fare se voglio 100 r?
yourdeveloperfriend

2
Non funzionerà con altri simboli perché sfrutta il riempimento dei numeri nelle stringhe di formato. I numeri possono essere riempiti con 0 davanti o dietro (per i decimali) senza cambiare il valore, le r non funzionano così.
Andrew,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.