【问题标题】:In Ruby how do I generate a long string of repeated text?在 Ruby 中,如何生成一长串重复的文本?
【发布时间】:2010-02-19 14:33:05
【问题描述】:

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

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}

还有其他建议吗?

【问题讨论】:

  • 最好的方法是使用 JRuby 并使用 StringBuffer。哦哦哦。

标签: ruby string


【解决方案1】:
str = "0" * 999999

【讨论】:

  • 确实,很奇怪,看看 Python 中看起来多么与众不同和优雅:str = "0" * 999999 ;)
  • 为什么顺序对 Ruby 很重要?当我做99999 * "0" 我得到TypeError: String can't be coerced into Fixnum
  • @Steven 从 Ruby 的角度来看,"0" * 999999 被视为"0".*(999999),其中*String 类中的一个方法。该方法接受数字作为执行字符串复制的有效参数。当你反转表达式时,我们得到999999.*("0")。现在我们讨论的是FixNum 类中的* 方法,该方法拒绝将字符串作为参数。它当然可以(例如,自动尽最大努力将参数转换为 FixNum),但语言设计者决定不完全接受 Ruby 的 Perlish 灵感。
【解决方案2】:

另一个相对快速的选择是

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,我该怎么办?
  • 它不适用于其他符号,因为它利用了格式字符串中的数字填充。数字可以在前面或后面用 0 填充(对于小数)而不改变值,r 不能那样工作。
猜你喜欢
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2012-03-16
  • 1970-01-01
  • 2010-09-10
相关资源
最近更新 更多