永続化
最近、Rubyを使い始めた。pythonより綺麗さに劣るが、なかなか面白いところもある。用途に応じて使い分けたいところ。
で、永続化だ。Rubyにはオブジェクトの永続化機構が色々と用意されている。例えばMarshalだとかYAMLだとか。それは良いのだが、それらでは関数オブジェクトが永続化が出来ない。手続きそのものを永続化するのは簡単なのだろうが、環境オブジェクトBindingが永続化しにくいのだと思われる。
とりあえず今作っているものではBindingが必要ないので、環境を無視したMarshal&YAML化できる関数を書いてみた。
class Function def initialize(src) @src = src end def func() @func = eval("proc {"+@src+"}") if (!defined?(@func)) return @func end def call(*args) func().call(*args) end def arity() func().arity() end def marshal_dump() return @src end def marshal_load(dump) @src = dump end def to_yaml() remove_instance_variable(:@func) if (defined?(@func)) return super() end end