永続化

最近、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