重复字符串 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 > 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
个临时数组是孤立的,必须进行垃圾回收。这样做没有问题,但这是一个相对低效的操作。
使用乘法有什么区别(假设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 > 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
个临时数组是孤立的,必须进行垃圾回收。这样做没有问题,但这是一个相对低效的操作。