Ruby eval magic

Can anybody explain me, why this is true:
self.class.class_eval{self} == self.class.instance_eval{self}

Thanks,
Dawid

It seems that we don't need class_eval method. Because if we use a
Module or Class directly, we can use:
SomeClass.instance_eval { ... }

and if we have an object and we need to work on its class, we can use:
some_object.class.instance_eval { ... }

So, do we need class_eval/module_eval?

Thanks,
Dawid

···

On Dec 14, 10:33 am, DMG <dmg2...@dmg.pl> wrote:

Can anybody explain me, why this is true:
self.class.class_eval{self} == self.class.instance_eval{self}

Thanks,
Dawid

unknown wrote:

It seems that we don't need class_eval method. Because if we use a
Module or Class directly, we can use:
SomeClass.instance_eval { ... }

and if we have an object and we need to work on its class, we can use:
some_object.class.instance_eval { ... }

So, do we need class_eval/module_eval?

Yes, we do. But it took me a while until I found out why.

When Ruby code is executing, there are two bits of state which are
maintained:
- the current object, which is exposed as 'self'
- the current class, where instance methods are defined. This is pretty
well hidden, but sometimes it matters.

Try the following code:

    class Foo; end

    Foo.class_eval "def bar; puts 'Hello!'; end"

    Foo.new.bar

If you change class_eval to instance_eval, it won't work as shown. In
fact you'll make a class method on Foo (Foo.bar)

AFAIK, class_eval and module_eval are the same thing though.

···

--
Posted via http://www.ruby-forum.com/\.

Oh, I see. Yes, the context matter when defining methods.
Thank you very much!

···

On Dec 14, 11:51 am, Brian Candler <b.cand...@pobox.com> wrote:

When Ruby code is executing, there are two bits of state which are
maintained:
- the current object, which is exposed as 'self'
- the current class, where instance methods are defined. This is pretty
well hidden, but sometimes it matters.

Try the following code:

class Foo; end

Foo\.class\_eval &quot;def bar; puts &#39;Hello\!&#39;; end&quot;

Foo\.new\.bar

If you change class_eval to instance_eval, it won't work as shown. In
fact you'll make a class method on Foo (Foo.bar)