0

コード全体がかなりかさばるので、ここにコピーしたくありませんが、その要点は次のとおりです。

require 'sinatra'

SOME_DATA = get_hashes_from_db

get '/' do

 # SOME_DATA's hashes are filtered using .delete
 result = process_data SOME_DATA, request

 response.body(JSON.generate(result))
end

すべてのリクエストで、ハッシュのリストはリクエストで送信されたいくつかのパラメータに基づいてフィルタリングされます。SOME_DATAに存在するいくつかのフィールドは、このフィルターに使用されますが、.deleteを使用してキー全体を消去するときに、フィールドが返送されるときに削除されます。例:

フィルタリング前:

{'condition' => 'rainy', 'data' => 'get an umbrella!'}

フィルタリング後:

{'data' => 'get an umbrella!'}

ここで問題:関数に渡された元の定数がダイシングされて数十回再割り当てされても、元の変数から再割り当てされた変数で.deleteメソッドを呼び出すと、元の定数に影響します。リクエスト1に応じて、たとえば、それぞれ10個のフィールドを持つ10個のハッシュを用意します。リクエスト2に応じて、ハッシュを10個用意しますが、それぞれ2〜5個のフィールドがあります。

私はこの男と同じ問題を抱えていると思いますが、問題が解決することを期待して.cloneでパスしようとしましたが、解決しませんでした。

私は以前にこの特定の問題に遭遇したことがありますが、私はそれを解決したことはないと思います。SOME_DATA.clone(上記の擬似コードで)渡したのに、なぜ元のファイルを上書きするのprocess_dataですか?

4

1 に答える 1

1

このようなことを試してください:

SOME_DATA = get_hashes_from_db.freeze

一部のコードが変更を試みたときに例外が発生するようになりましたSOME_DATA

またget_hashes_from_db、配列またはハッシュを返す場合は、freeze各配列/ハッシュ要素も必要です。

于 2013-01-19T21:59:00.087 に答える