Ruby 是否有可能创建;SystemStackError:堆栈级别太深“;没有递归的错误?
考虑以下irb交互作用: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}
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
我真的想不出这些知识的实际应用,但我很好奇…我真的想不出这些知识的实际应用,但我很好奇。。。