Проводка вопроса на stackoverflow.com, как забавно: -)
Я запускаю некоторый рекурсивный код Ruby, и я получаю: "Stack level too deep (SystemStackError)"
(я уверен, что код работает, что я не в бесконечной рекурсивной спирали смерти, но это не так).
Можно ли изменить допустимую глубину/размер стека для моего приложения Ruby?
Я не совсем понимаю это, если это ограничение в Ruby, поскольку ошибка говорит "Уровень стека", что дает мне впечатление, что Ruby как-то считает "уровнями" стека, или если это просто означает, что стек заполнен.
Я попытался запустить эту программу под Vista и Ubuntu с тем же результатом. В Ubuntu я попытался изменить размер стека с помощью 'ulimit -s' с 8192 до 16000, но это ничего не изменило.
Изменить: Спасибо за отзывы. Я действительно понимаю, что использование рекурсивной функции, возможно, не самый надежный способ. Но дело не в этом. Я просто задаюсь вопросом, есть ли способ увеличить размер стека.. период. И, как я уже говорил, я попытался запустить ulimit -s 16000 перед запуском ruby script.. без каких-либо улучшений.. Я использую это неправильно?
Edit2:
На самом деле у меня была бесконечная рекурсия в краевом случае кода.
Усеченная трассировка рубинового стека, когда вы получаете ошибку "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
-Andreas