我有一个在ruby 项目中似乎无法解决的堆栈溢出问题。在文件movie.rb 的第44-47 行,我调用了包含在文件mmc.rb 中的函数。
当我单独测试文件时, mmc.rb 工作正常,但在循环中调用了几次,它会导致 SO。
我的堆栈跟踪位于以下Gist中。
我真的不明白我为什么得到这个。
我有一个在ruby 项目中似乎无法解决的堆栈溢出问题。在文件movie.rb 的第44-47 行,我调用了包含在文件mmc.rb 中的函数。
当我单独测试文件时, mmc.rb 工作正常,但在循环中调用了几次,它会导致 SO。
我的堆栈跟踪位于以下Gist中。
我真的不明白我为什么得到这个。
这不是一个确定的答案,而只是两个评论:
首先,在函数中定义方法/函数没有必要或好处,您的代码只会变得不必要地复杂。如果你能解决它,尽量避免这种模式(在你的情况下,绝对不需要这样的代码)。
第二:你的堆栈级别太深发生在Net::HTTP
模块中的某个地方,所以我很快检查了你关于Net::HTTP
调用的代码。您正在使用open-uriopen
库中的函数,但您没有正确使用它:每当您打开某个流进行阅读时,您必须在完成后关闭它。您可以使用以下技术实现此目的:
# 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}
... 这也可以将您的堆栈级别修复得太深,但我不能保证。但是一旦你重构了代码,调试你的问题就会更容易......