【发布时间】:2018-08-23 23:17:49
【问题描述】:
我做了两个数组,每个数组有 100 万个项目:
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 不是一个好主意吗?
【问题讨论】:
-
我没有确切的答案,但总的来说,我会说传递非常大的参数列表(其中“超过”定义为几百个以上)往往会导致奇怪的行为,因为参数列表通常存储在内存中的某个位置,它会假设它们的大小。有些语言甚至明确定义了最大参数计数;例如,在 Common Lisp 中,变量
CALL-ARGUMENTS-LIMIT告诉您参数的最大数量。