配列のようなものを可読な状態で保存
最近はロイディという人工無脳を弄って遊んでいる。
本家ロイディは、ログと単語の保存をバイナリな内部ファイルと、human readableな外部ファイルに分けて保存し、外部ファイルに変更があればそれを内部ファイルに反映するという少し面倒な事をしているので、これを改善しようと思い立った。
人間が読めてかつRubyのオブジェクトとしての復元も可能な形で保存が出来れば、内外の区別を廃して1つのファイルにまとめる事ができる。
必要としては、n番目の要素を取り出せ、末尾に要素を追加出来ればそれで良かった。
まず思いついたのがYAML::Storeだったが、何もかも1つのYAMLドキュメントに突っ込む仕様である為、トランザクションの出入りを行う度に巨大なYAMLドキュメントを読み書きする事になり、メモリの消費も激しく、遅い。
そこでYAMLドキュメントを細かく分け、必要な部分だけをロードするようにした。
#n番目の要素を取り出す def [](n) n += @size if n < 0 #末尾からのインデックス File.open(@filename) do |f| f.each_line("\n---") do |s| return YAML.load(s) if f.lineno > n end end end
新たな要素をpushしたい時は、追加したい要素をYAML.dumpしてファイルに追記するだけでよい。
複数のロイディが同じファイルを共有して動作する事は想定していないので、ファイルのロックもしないし、トランザクションという概念もないが、用途には十分であった。