在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。哦
乔纳森·芬伯格

Answers:


307
str = "0" * 999999

22
确实,很奇怪,看起来在Python中看起来多么与众不同:str = "0" * 999999;)
tokland

1
为什么对Ruby来说订单很重要?我何时99999 * "0"收到TypeError: String can't be coerced into Fixnum
Steven

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 r怎么办?
yourdeveloperfriend 2014年

2
它不能与其他符号一起使用,因为它利用了格式字符串中的数字填充功能。数字可以在前面或后面用0填充(对于小数),而无需更改值,r不能那样工作。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.