On Nov 16, 2007 4:06 PM, Greg Weeks <greg.weeks / arm.com> wrote:
> I've poked around, but I don't get instance_eval at all.
>
> I do know what it means to evaluate code in the context of a *class*
> object.  Ie, I know what *this* does:
>
>     class Foo
>       # We're now in the context of the object Foo.
>       C = 1
>       class Bar
>   def bar ; "bar" ; end
>       end
>       def foo ; "foo" ; end
>     end
>     p Foo::C  ->  1
>     p Foo::Bar.new.bar  ->  "bar"
>     p Foo.new.foo  ->  "foo"
>
> Now let's try this again with "instance_eval":
>
>     class Foo
>     end
>     Foo.instance_eval do
>       # We're now supposedly in the context of the object Foo.
>       C = 1
>       class Bar
>   def bar ; "bar" ; end
>       end
>       def foo ; "foo" ; end
>     end
>     p Foo::C
>     p Foo::Bar.new.bar
>     p Foo.new.foo
>
> Nothing works as I expected.  The result is:
>
> tmp.rb:26: warning: toplevel constant C referenced by Foo::C
> 1
> tmp.rb:27: warning: toplevel constant Bar referenced by Foo::Bar
> "bar"
> tmp.rb:28: undefined method `foo' for #<Foo:0x401c25b0> (NoMethodError)
>
> Evidentally, C and Bar scoped lexically, rather than being in the
> context of Foo.  And the foo definition ended up in the context of
> "class <<Foo ... end".
>
> So, hat in hand, I ask for a description of "instance_eval".

It only affects the execution context by binding self to the instance,
NOT the lexical context.



-- 
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/