堆栈级别太深-Ruby

堆栈级别太深-Ruby,ruby,stack-overflow,net-http,Ruby,Stack Overflow,Net Http,我有一个堆栈溢出问题,我似乎无法在短时间内解决。在文件movie.rb的第44-47行,我调用了文件mmc.rb中包含的函数。 当我单独测试这个文件时,mmc.rb工作得很好,但是在循环中调用了几次,它会导致一个SO 我的stacktrace如下所示 我真的不明白我为什么会得到这个答案。这不是一个明确的答案,但只有两点: 首先,在函数中定义方法/函数没有必要,也没有好处,代码变得不必要的复杂。如果可以解决这个问题,请尽量避免使用这种模式(在您的情况下,绝对不需要这样的代码) 第二:堆栈级别太深发

我有一个堆栈溢出问题,我似乎无法在短时间内解决。在文件movie.rb的第44-47行,我调用了文件mmc.rb中包含的函数。
当我单独测试这个文件时,mmc.rb工作得很好,但是在循环中调用了几次,它会导致一个SO

我的stacktrace如下所示


我真的不明白我为什么会得到这个答案。

这不是一个明确的答案,但只有两点:

首先,在函数中定义方法/函数没有必要,也没有好处,代码变得不必要的复杂。如果可以解决这个问题,请尽量避免使用这种模式(在您的情况下,绝对不需要这样的代码)

第二:堆栈级别太深发生在
Net::HTTP
模块中的某个地方,因此我快速检查了有关
Net::HTTP
调用的代码。您正在使用OpenURI库中的
open
函数,但没有正确使用它:每当您打开某个流进行读取时,必须在完成后关闭它。您可以使用以下技术实现这一点:

# sequential version -> you close the stream by yourself when
# you are done with it
stream = open('http://some.url/some/path')
data = stream.read
stream.close

# block version -> the open function closes the stream for you
# as soon as the passed block is evaluated.
data = open('http://some.url/some/path') {|stream| stream.read}

因此,您应该将代码中所有出现的
open(…).read
替换为
open(…){s | s.read}
。。。这可能会修复您的堆栈级别太深,但我不能保证。但是,一旦你重构了代码,就可以更容易地调试你的问题……

你真的必须在另一个方法中定义方法吗?!这一点很好,但即使在第12行定义了mmc方法,而不是围绕所有内容,我仍然让SOI重构了我的代码,但它并没有解决我的问题。谢谢