@m_seki の

I like ruby tooから引っ越し

bindingとinstance_eval

ERBで‥を読んで、Structだとどうだろって試していてはまった。

require 'erb'

Foo = Struct.new(:foo, :bar)
class Foo
  def env
    binding
  end
end

foo = Foo.new('foo', 'bar')
p ERB.new('<%= foo %> and <%= bar %>').result(foo.env)

よしよし。

"foo and bar"

envメソッドなくしてみよう。

require 'erb'

Foo = Struct.new(:foo, :bar)
foo = Foo.new('foo', 'bar')
p ERB.new('<%= foo %> and <%= bar %>').result(foo.instance_eval{binding})

とほほ、fooが‥。

"#<struct Foo foo=\"foo\", bar=\"bar\"> and bar"

instance_evalはそのインスタンスの環境と、ローカル変数からなるbindingになってしまうのでしたとさ。

それはそれとして、ほんとに最初に書いたやつはこっち。

require 'erb'

Foo = Struct.new(:foo, :bar)
ERB.new('<%= foo %> and <%= bar %>').def_method(Foo, 'foo_view')

foo = Foo.new('foo', 'bar')
p foo.foo_view