メソッド名と同じローカル変数がある場合はローカル変数が優先される

2008-05-28

require 'erb'

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

これはfooがすでにローカル変数として宣言されているからそっちが優先された話でしょう。

foo.instance_eval { foo }       # => #<struct Foo foo="foo", bar="bar">
foo.instance_eval{ defined? foo } # => "local-variable"
foo.instance_eval{ defined? bar } # => "method"