Как в Ruby создать длинную строку повторяющегося текста?

139

Как лучше всего быстро сгенерировать длинную строку в рубине? Это работает, но очень медленно:

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

Я также заметил, что создание строки приличной длины и последующее добавление ее к существующей строке до желаемой длины работает намного быстрее:

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

Есть другие предложения?

Маркус Оррелли
источник
1
Лучшим способом было бы использовать JRuby и использовать StringBuffer. Ооооо.
Джонатан Файнберг,

Ответы:

311
str = "0" * 999999
FMc
источник
22
Действительно, очень странно, посмотрите, как по-разному и элегантно выглядит в Python str = "0" * 999999
:;
1
Почему порядок важен в Ruby? Когда я это сделаю, 99999 * "0"я получуTypeError: String can't be coerced into Fixnum
Стивен
16
@Steven С точки зрения Ruby, "0" * 999999рассматривается как "0".*(999999)где *находится метод в Stringклассе. Этот метод принимает числа как допустимые аргументы для выполнения репликации строки. Если перевернуть выражение, мы получим 999999.*("0"). Теперь мы говорим о *методе в FixNumклассе, и этот метод отказывается принимать строки в качестве аргументов. Конечно, может (например, автоматически прилагая все усилия для преобразования аргумента в FixNum), но разработчики языка решили не использовать идеи Ruby Perlish в полной мере.
FMc
11

Другой относительно быстрый вариант -

str = '%0999999d' % 0

Хотя бенчмаркинг

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

Показывает, что умножение еще быстрее

               user     system      total        real
format  :  0.300000   0.080000   0.380000 (  0.405345)
multiply:  0.080000   0.080000   0.160000 (  0.172504)
рамп
источник
Мне нравится этот ответ, но я не могу заставить его работать ни для чего, кроме «0». Что мне делать, если я хочу 100 р?
yourdeveloperfriend
2
Он не будет работать с другими символами, потому что он использует числовое заполнение в строках формата. Числа могут быть дополнены нулями спереди или сзади (для десятичных знаков) без изменения значения, r так не работает.
Эндрю