-1

Ruby プロジェクトでは解決できないスタック オーバーフローの問題があります。ファイル movie.rb の 44 ~ 47 行目で、ファイル mmc.rb に含まれる関数を呼び出します。
ファイルを単独でテストすると、mmc.rb は正常に動作しますが、ループ内で数回呼び出されると、SO が発生します。

私のスタックトレースは次のGistにあります。

なぜこれを手に入れたのか、本当にわかりません。

4

1 に答える 1

1

これは決定的な答えではありませんが、2 つのコメントだけです。

まず、関数内でメソッド/関数を定義する必要も利点もありません。コードが不必要に複雑になるだけです。回避できる場合は、このパターンを避けるようにしてください (この場合、このようなコードを作成する必要はまったくありません)。

2 番目:スタック レベルが深すぎるという問題がモジュール内のどこかで発生しているため、呼び出しNet::HTTPに関するコードをすぐに確認しました。open-uriライブラリの関数をNet::HTTP使用していますが、適切に使用していません。読み取りのためにストリームを開くたびに、完了したら閉じなければなりません。次の手法を使用してそれを実現できます。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}... に置き換える必要があります。しかし、コードをリファクタリングするとすぐに、問題のデバッグが容易になります...

于 2012-10-22T13:54:32.033 に答える