在Ruby中如何生成一长串重复文本?

Mar*_*lly 131 ruby string

在ruby中快速生成长字符串的最佳方法是什么?这有效,但速度很慢:

str = ""
length = 100000
(1..length).each {|i| str += "0"}
Run Code Online (Sandbox Code Playgroud)

我还注意到,创建一个相当长的字符串,然后将其附加到现有字符串,达到所需的长度会更快:

str = ""
incrementor = ""
length = 100000
(1..1000).each {|i| incrementor += "0"}
(1..100).each {|i| str += incrementor}
Run Code Online (Sandbox Code Playgroud)

还有其他建议吗?

FMc*_*FMc 296

str = "0" * 999999
Run Code Online (Sandbox Code Playgroud)

  • 确实,非常奇怪,看看Python中有多么不同和优雅的外观:`str ="0"*999999`;) (22认同)
  • @Steven从Ruby的角度来看,`"0"*999999`被视为"0".*(999999)`其中`*`是`String`类中的一个方法.该方法接受数字作为执行字符串复制的有效参数.当你反转表达式时,我们得到`999999.*("0")`.现在我们讨论`FixNum`类中的`*`方法,该方法拒绝将字符串作为参数.它当然可以(例如,自动尽最大努力将参数转换为FixNum)但语言设计者决定不要过于充分地接受Ruby的Perlish灵感. (16认同)
  • 经典红宝石哈哈 (4认同)

ram*_*ion 11

另一个相对快速的选择是

str = '%0999999d' % 0
Run Code Online (Sandbox Code Playgroud)

通过基准测试

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

表明乘法仍然更快

               user     system      total        real
format  :  0.300000   0.080000   0.380000 (  0.405345)
multiply:  0.080000   0.080000   0.160000 (  0.172504)
Run Code Online (Sandbox Code Playgroud)

  • 它不适用于其他符号,因为它利用格式字符串中的数字填充.数字可以在前面或后面填充0(对于小数)而不改变值,r不会那样工作. (2认同)