オブジェクトをファイルに保存して、ファイルから簡単に読み取れるようにしたいと思います。簡単な例として、次の3D配列があるとします。
m = [[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]]
ファイルからのデータを解釈するパーサーをプログラミングせずにこれを達成するために使用できる簡単なRuby APIはありますか?私が与える例では簡単ですが、オブジェクトがより複雑になるにつれて、オブジェクトを永続化するのは面倒です。
マーシャルを参照してください: http://Ruby-doc.org/core/classes/Marshal.html
-または-
オブジェクトをファイルに保存し、逆シリアル化して取得する前に、オブジェクトをシリアル化する必要があります。 Coryが述べたように、2つの標準シリアル化ライブラリが広く使用されています Marshal
および YAML
。
Marshal
とYAML
はどちらも、それぞれシリアル化と逆シリアル化にメソッドdump
とload
を使用します。
これらの使用方法は次のとおりです。
m = [
[
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]
],
[
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]
]
]
# Quick way of opening the file, writing it and closing it
File.open('/path/to/yaml.dump', 'w') { |f| f.write(YAML.dump(m)) }
File.open('/path/to/marshal.dump', 'wb') { |f| f.write(Marshal.dump(m)) }
# Now to read from file and de-serialize it:
YAML.load(File.read('/path/to/yaml.dump'))
Marshal.load(File.read('/path/to/marshal.dump'))
ファイルの読み取り/書き込みに関連するファイルサイズやその他の癖に注意する必要があります。
詳細については、もちろんAPIドキュメントを参照してください。
YAMLとMarshalが最も明白な答えですが、データをどのように処理するかによっては、 sqlite も便利なオプションになる場合があります。
require 'sqlite3'
m = [[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]]
db=SQLite3::Database.new("demo.out")
db.execute("create table data (x,y,z,value)")
inserter=db.prepare("insert into data (x,y,z,value) values (?,?,?,?)")
m.each_with_index do |twod,z|
twod.each_with_index do |row,y|
row.each_with_index do |val,x|
inserter.execute(x,y,z,val)
end
end
end