143 votes

En Ruby, comment puis-je générer une longue chaîne de texte répétée ?

Quelle est la meilleure façon de générer rapidement une longue chaîne de caractères en ruby ? Ceci fonctionne, mais est très lent :

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

J'ai également remarqué que la création d'une chaîne d'une longueur décente, puis son ajout à une chaîne existante jusqu'à la longueur souhaitée, fonctionne beaucoup plus rapidement :

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

D'autres suggestions ?

1 votes

Le meilleur moyen serait d'utiliser JRuby et d'utiliser StringBuffer. Oooooh.

318voto

FMc Points 22663
str = "0" * 999999

22 votes

En effet, très bizarre, regardez comme c'est différent et élégant en Python : str = "0" * 999999 ;)

1 votes

Pourquoi l'ordre est-il important avec Ruby ? Lorsque je fais 99999 * "0" Je reçois TypeError: String can't be coerced into Fixnum

16 votes

@Steven Du point de vue de Ruby, "0" * 999999 est traité comme "0".*(999999)* est une méthode dans le String classe. Cette méthode accepte les nombres comme arguments valides pour effectuer la réplication des chaînes de caractères. Lorsque l'on inverse l'expression, on obtient 999999.*("0") . Nous parlons maintenant de la * dans la méthode FixNum et cette méthode refuse de prendre des chaînes de caractères comme arguments. Elle pourrait certainement le faire (par exemple, en faisant automatiquement un effort pour convertir l'argument en un FixNum), mais les concepteurs du langage ont décidé de ne pas trop s'inspirer de l'esprit Perlish de Ruby.

11voto

rampion Points 38697

Une autre option relativement rapide est

str = '%0999999d' % 0

Bien que l'analyse comparative

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

Montre que la multiplication est toujours plus rapide

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

0 votes

J'aime cette réponse, mais je n'arrive pas à la faire fonctionner pour autre chose que '0'. Que dois-je faire si je veux 100 r ?

2 votes

Il ne fonctionnera pas avec d'autres symboles car il tire parti du remplissage des nombres dans les chaînes de format. Les nombres peuvent être complétés par des 0 devant ou derrière (pour les décimales) sans changer la valeur, les r ne fonctionnent pas de cette façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X