重复字符串 N 次 - 乘法 VS 枚举器

Repeating String N times - multiplication VS enumerator

使用乘法有什么区别(假设n是整数):

new_string = string * n

和一个枚举器:

new_string = ""
n.times do { new_string += string }`

输出看起来是一样的,但我不确定 proper/correct 是哪种方法。

非常感谢您提供一些意见。

输出应该不同。第一个选项创建一个 String 的新实例,其中包含 string 重复 n 次。第二个选项在每次迭代中都会改变原始 string,因此它的重复次数远远超过 n 次。

例如:

string = 'Abc'
n = 3
n.times do { string += string }

后续迭代后 string 的值将是:

init: Abc
'AbcAbc'
'AbcAbcAbcAbc'

如果您使用不同的字符串作为缓冲区,这可能会以相同的方式工作:

new_string = ""
n.times { new_string += string }

我认为 string * n 的内存效率更高(只有一个新分配)。

String#* 是在 C 中实现的,但我希望 Ruby 等效于以下内容。

class String
  def *(n)
    return "" if n.zero?
    (n-1).times.reduce(dup) { |s,_| s << self }
  end
end

str = 'abc'
str*(3)
  #=> "abcabcabc"

我们看到,对于 n > 0str 被附加到 str n-1 次的 dup 之后。没有创建临时数组。这不会改变 str (str #=> "abc")。

现在考虑:

str = 'abc'
n = 3

new_string = ""
n.times do { new_string += str }  

这也不会改变 str,但由于 new_string += str 扩展为

new_string = new_string + str

我们看到该表达式的右侧导致创建 n 个数组,并依次将变量 new_string 分配给每个数组。因此,n-1 个临时数组是孤立的,必须进行垃圾回收。这样做没有问题,但这是一个相对低效的操作。