Як створити довгий рядок повторного тексту в Ruby?


138

Який найкращий спосіб швидко створити довгу струну в рубіні? Це працює, але дуже повільно:

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. Ооооо.
Джонатан Фейнберг

Відповіді:


307
str = "0" * 999999

22
Дійсно, дуже дивно, подивіться, як по-різному і елегантно виглядає Python str = "0" * 999999
:;

1
Чому для Рубі важливий порядок? Коли я 99999 * "0"дістаюсьTypeError: String can't be coerced into Fixnum
Стівен

16
@Steven З точки зору Рубі, "0" * 999999розглядаються як "0".*(999999)де *є метод в Stringкласі. Цей метод приймає числа як дійсні аргументи для виконання реплікації рядків. Коли ви повернете вираз, ми отримаємо 999999.*("0"). Зараз ми говоримо про *метод у FixNumкласі, і цей метод відмовляється приймати рядки як аргументи. Це, звичайно, могло (наприклад, автоматично доклавши всіх зусиль для перетворення аргументу у FixNum), але мовні дизайнери вирішили проти занадто повно сприймати натхнення Рубі.
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
Він не працюватиме з іншими символами, тому що використовує переваги з додаванням цифр у рядках формату. Цифри можуть бути заміщені 0 у передній або задній частині (для десятків), не змінюючи значення, r не працює так.
Андрій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.