Rubyスクリプトで受け取った文字列をhashに一時的にではなく恒常的に書き込むには

投稿者: Anonymous

以前こちらで似たトピックを立てましたが根本的な解決には至らなかったので質問させていただきます。

#!/usr/bin/ruby 
number = ARGV[0];user_name = ARGV[1]

h = {}

h.store(number, user_name)

以前のトピックを参考に少しばかり修正してみてもやはり h 変数に代入されたHashオブジェクトには一時的に入力されたキーと値が保存されますが恒常的には保存されませんでした。この場合キーと値を恒常的に h のHashオブジェクトに保存するにはどうすれば良いのでしょうか?昨日あたりに調べてみとるとJSONに書き込んでいく方法が見つかりましたが、できればRubyスクリプト内で完結させたいと思っています。

解決

Rubyに限った話ではありませんが、スクリプトは実行が終了するとそのメモリーが解放され、使用したメモリーもその内容も消えてしまいます。
質問者さんの意図は、プログラムがデーターを読み取ったときに、今動いているプログラム自身を書き換えたり、コードを追加し、次に動いたときには、書き加えた部分のコードも実行されたいと仰っている様に思えますが、いかにスクリプト言語とは言え、受け取ったデーターをそのスクリプト言語のプログラムコードに書き戻し、再度実行するときにはそれを読み込んだ上で実行したいと読めますが、それはとても難しい事だと思います。

そのため、一般的にはSerialize/Deserializeという手法で、インスタンスを(外部に)保存出来る形にして、それを自身でファイルに「シリアライズして保存」「保存されたものを読み込んでデシリアライズ」するというのが一般的な(オブジェクトの)インスタンスを永続化する方法になるかと思います。
Rubyにおいては、serializeMarshal#dumpdesrializeMarshal#loadにて行えます。

以下に、一つのインスタンスを一つのファイルに書き出すサンプルを作成してみました。複数のインスタンスを纏めて管理したいときには、改造したり、とてもたくさんのデーターを永続化するのであれば、データーベースやそのラッパーを利用した永続化を行う設計を検討する必要がありますが、まずは参考にしてみて下さい。

#!/usr/bin/ruby

#永続化
    # (オブジェクトの)インスタンスのファイルへの書き出し
def serialize(object, savePath)
    File.open(savePath, "w") { |file|
        dump = Marshal.dump(object)
        file.puts(dump)
    }
end
    # ファイルからインスタンスの復元
def deserialize(savePath)
    dumped = "" # スコープ解決のため、定義のみここで行う
    File.open(savePath, "r") { |file|
        dumped = file.read
    }
    Marshal.load(dumped)
end

# 動作確認
h = Hash.new()
h["abc"] = 123

serialize(h, "./parmanent")

g = deserialize("./parmanent")

p g # => {"abc"=>123}
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *