-1

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

我的堆栈跟踪位于以下Gist中。

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

4

1 回答 1

1

这不是一个确定的答案,而只是两个评论:

首先,在函数中定义方法/函数没有必要或好处,您的代码只会变得不必要地复杂。如果你能解决它,尽量避免这种模式(在你的情况下,绝对不需要这样的代码)。

第二:你的堆栈级别太深发生在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}... 这也可以将您的堆栈级别修复得太深,但我不能保证。但是一旦你重构了代码,调试你的问题就会更容易......

于 2012-10-22T13:54:32.033 回答