Строка # * реализована в 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
добавляется к dup
из str
n-1
раз.Временные массивы не создаются.Это не изменяет 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
временных массивов становятся сиротами и должны собираться мусором.Это не проблема, но это относительно неэффективная операция.