(私の以前の質問へのフォローアップRuby: how can I copy a variable without pointing to the same object?)Ruby:この配列をコピーするにはどうしたらいいですか?
単純なRubyプログラムを作成して.svgファイルに置き換えます。最初のステップは、ファイルから情報を取り出して配列に入れることです。この関数が呼び出されるたびにディスクからファイルを読み込まないようにするには、memoizeデザインパターンを使用しようとしています。最初の呼び出しの後にすべての呼び出しでキャッシュされた結果を使用します。
これを行うには、関数の直前で定義されたグローバル変数を使用しています。しかし、私は.dup
ローカル変数を返す前にその変数をローカル変数に戻しても、この変数を呼び出す関数はグローバル変数を変更しています。
#memoize to keep from having to read original file on each pass
$svg_filedata_cache = [] #the global variable
def svg_filedata(filename)
if $svg_filedata_cache.empty?
File.open(filename, "r"){|f| $svg_filedata_cache = f.readlines}
end
svg_filedata_cache = $svg_filedata_cache.dup #try to copy it
return svg_filedata_cache #SHOULD point to a different object (but doesn't)
end
二つの質問(いずれかまたは両方を答える):
- なぜにとり、値がここで返さ修正する他の機能は、また影響を与えない。ここ
は私の実際のコードです私はそれをコピーするために
.dup
を使用しましたが、グローバル変数? - 私はRubyを初めて使いました。これはRubesqueのやり方ではないと確信しています(とにかく、グローバル変数が好きではありません)。より良い戦略を提案できますか?
P.S.実際には$ svg_filedata_cache [filename]でなければならないことが分かります。これは、異なるファイル名を使って関数呼び出しをすることができますが、この場合は必要ありません。 –
ところで、グローバルと返されたオブジェクトは別のobject_idを持っています。返された配列内の文字列に言及していると思います。 – khelll
@khell - はい、私は元の配列の内容が変更されているという事実に基づいて声明を出しました。 –