Ruby 是否有可能创建;SystemStackError:堆栈级别太深“;没有递归的错误?

Ruby 是否有可能创建;SystemStackError:堆栈级别太深“;没有递归的错误?,ruby,recursion,stack,Ruby,Recursion,Stack,考虑以下irb交互作用: 2.1.1 :001 > def do_it 2.1.1 :002?> do_it 2.1.1 :003?> end => :do_it 2.1.1 :004 > do_it SystemStackError: stack level too deep 在本例中,它是检测到堆栈耗尽的确定性,还是实际耗尽了堆栈?不使用递归是否可能产生此错误?它实际上已达到最大堆栈限制 def do_it x=1 puts "Do it #{x}

考虑以下irb交互作用:

2.1.1 :001 > def do_it
2.1.1 :002?>   do_it
2.1.1 :003?> end
 => :do_it 
2.1.1 :004 > do_it
SystemStackError: stack level too deep

在本例中,它是检测到堆栈耗尽的确定性,还是实际耗尽了堆栈?不使用递归是否可能产生此错误?

它实际上已达到最大堆栈限制

def do_it x=1
  puts "Do it #{x}"
  do_it x+1
end
do_it
以下是Ruby堆栈限制的合理解释:


Ruby堆栈详细信息摘要 由@gregspurrier提供:

  • v1.8.x使用C堆栈
  • v1.9.x使用具有自己堆栈的虚拟内存
  • v2.0.0此VM限制可通过
    RUBY\u线程\u VM\u堆栈\u大小设置

它确实达到了最大堆栈限制

def do_it x=1
  puts "Do it #{x}"
  do_it x+1
end
do_it
以下是Ruby堆栈限制的合理解释:


Ruby堆栈详细信息摘要 由@gregspurrier提供:

  • v1.8.x使用C堆栈
  • v1.9.x使用具有自己堆栈的虚拟内存
  • v2.0.0此VM限制可通过
    RUBY\u线程\u VM\u堆栈\u大小设置

它实际上耗尽了堆栈上的空间。 每个方法调用都需要堆栈上的一些空间。您可以编写如下代码:

def method_1
  method_2
end
def method_2
  method_3
end
...
...
def method_123456
  method_123457
end

method_1

没有涉及递归,但在某一点上它仍然会耗尽堆栈空间。

它实际上耗尽了堆栈上的空间。 每个方法调用都需要堆栈上的一些空间。您可以编写如下代码:

def method_1
  method_2
end
def method_2
  method_3
end
...
...
def method_123456
  method_123457
end

method_1
虽然没有涉及递归,但它仍会在某个点耗尽堆栈空间

在本例中,它是检测到堆栈耗尽的确定性,还是实际耗尽了堆栈

它实际上已经用完了堆栈。事实上,在一般情况下,由于计算机科学的核心问题之一,不可能“检测出堆栈耗尽的确定性”

不使用递归是否可能产生此错误

当然。只需定义许多方法,每个方法都会调用下一个:

20000.times do |n|
  define_method :"foo_#{n}" do
    puts "Called #{__method__}"
    send :"foo_#{n+1}"
  end
end

foo_0
# -> Called foo_0
# -> Called foo_1
# -> Called foo_2
# -> Called foo_3
# ...
# -> Called foo_4931
# -> SystemStackError: stack level too deep
在本例中,它是检测到堆栈耗尽的确定性,还是实际耗尽了堆栈

它实际上已经用完了堆栈。事实上,在一般情况下,由于计算机科学的核心问题之一,不可能“检测出堆栈耗尽的确定性”

不使用递归是否可能产生此错误

当然。只需定义许多方法,每个方法都会调用下一个:

20000.times do |n|
  define_method :"foo_#{n}" do
    puts "Called #{__method__}"
    send :"foo_#{n+1}"
  end
end

foo_0
# -> Called foo_0
# -> Called foo_1
# -> Called foo_2
# -> Called foo_3
# ...
# -> Called foo_4931
# -> SystemStackError: stack level too deep

我真的想不出这些知识的实际应用,但我很好奇…我真的想不出这些知识的实际应用,但我很好奇。。。