Я сделал два массива, каждый с 1 миллионом предметов:
a1 = 1_000_000.times.to_a
a2 = a1.clone
Я попытался нажать a2 в a1:
a1.push *a2
Это возвращает SystemStackError: stack level too deep
.
Однако, когда я пытаюсь выполнить concat
, я не получаю ошибку:
a1.concat a2
a1.length # => 2_000_000
Я также не получаю ошибку с оператором splat:
a3 = [*a1, *a2]
a3.length # => 2_000_000
Почему это так? Я посмотрел документацию на Array#push
, и он написан на C. Я подозреваю, что он может делать некоторую рекурсию под капотом и почему он вызывает эту ошибку для больших массивов. Это правильно? Разве не рекомендуется использовать push
для больших массивов?