【发布时间】:2020-01-24 23:09:54
【问题描述】:
使用乘法有什么区别(假设n是整数):
new_string = string * n
和一个枚举器:
new_string = ""
n.times do { new_string += string }`
输出似乎相同,但我不确定哪种方法是正确/正确。
我很感激对此的一些意见。
【问题讨论】:
标签: ruby string integer enumeration
使用乘法有什么区别(假设n是整数):
new_string = string * n
和一个枚举器:
new_string = ""
n.times do { new_string += string }`
输出似乎相同,但我不确定哪种方法是正确/正确。
我很感激对此的一些意见。
【问题讨论】:
标签: ruby string integer enumeration
输出应该不同。第一个选项创建一个 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 * 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 > 0,str 被附加到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 临时数组是孤立的,必须进行垃圾回收。这样做没有问题,但这是一个相对低效的操作。
【讨论】: