在 stackoverflow.com 上发布堆栈溢出问题,多么有趣:-)
我正在运行一些递归 Ruby 代码,我得到:"Stack level too deep (SystemStackError)"
(我很确定代码有效,我没有处于无限递归的死亡螺旋中,但这不是重点)
无论如何可以更改我的 Ruby 应用程序允许的堆栈深度/大小?
如果这是 Ruby 中的限制,我不太明白,因为错误显示“堆栈级别”,这给我的印象是 Ruby 以某种方式计算堆栈的“级别”,或者它只是意味着堆栈已满。
我试过在 Vista 和 Ubuntu 下运行这个程序,结果相同。在 Ubuntu 下,我尝试使用 'ulimit -s' 将堆栈大小从 8192 更改为 16000,但这并没有改变任何东西。
编辑:感谢您的反馈。
我确实意识到使用递归函数可能不是最可靠的方法。但这也不是重点。我只是想知道是否有办法增加堆栈大小......期间。正如我所提到的,我确实在运行 ruby 脚本之前尝试运行 ulimit -s 16000 ..没有任何改进..我用错了吗?
Edit2:实际上,我在代码的边缘情况下进行了无限递归。
收到错误时截断的 ruby 堆栈跟踪"Stack level too deep"
有点误导。
当具有涉及多个函数的递归行为时,您会得到递归数量比实际数量少得多的印象。在此示例中,可能会在超过 190 次调用后崩溃,但实际上大约是 15000 次调用
tst.rb:8:in `p': stack level too deep (SystemStackError)
from tst.rb:8:in `bar'
from tst.rb:12:in `bar'
from tst.rb:19:in `foo'
from tst.rb:10:in `bar'
from tst.rb:19:in `foo'
from tst.rb:10:in `bar'
from tst.rb:19:in `foo'
from tst.rb:10:in `bar'
... 190 levels...
from tst.rb:19:in `foo'
from tst.rb:10:in `bar'
from tst.rb:19:in `foo'
from tst.rb:22
-安德烈亚斯