define_method and alias_method is not relevant to class_eval and instance_eval

M

Minkoo Seo

Hi.

I have a question on the semantics of define_method and alias_method.
Let me start with class_eval and instance_eval. Following is the
excerpt from ri class_eval and ri instance_eval:

* Module.class_eval
Evaluates the string or block in the context of mod. This can be used
to add methods to a class. module_eval returns the result of
evaluating its argument.

* Object.instance_eval
Evaluates a string containing Ruby source code, or the given block,
within the context of the receiver (obj). In order to set the context,
the variable self is set to obj while the code is executing, giving
the code access to obj's instance variables. In the version of
instance_eval that takes a String, the optional second and third
parameters supply a filename and starting line number that are used
when reporting compilation errors.

Therefore, given class Foo; end, Foo.class_eval interprets given block
while treating Foo as a class. Hence, because Foo is a class,
following code adds instance method "instance_hello2".

Foo.class_eval %{
# Add f.instance_hello2 and
# g.instance_hello2
#
# class Foo
# def instance_hello2
# "instance_hello2"
# end
# end
#
def instance_hello2
"instance_hello2"
end
}

On the other hand, Foo.instance_eval interprets given block while
treating Foo itself as the context . Hence, following code adds class
method to "Foo.class_hello2":

Foo.instance_eval %{
# Add Foo.class_hello2
#
# def Foo.class_hello2
# "class_hello2"
# end
def class_hello2
"class_hello2"
end
}

But the problem is define_method do not run differently whatever the
context is:

Foo.class_eval %q[
define_method:)yyy) { "yyy" }
]

generates instance method yyy. And,

Foo.class_eval %q[
define_method:)yyy) { "yyy" }
]

also generates instance method yyy. Following code generates Foo.zzz
regardless of the context, instance_eval/class_eval, too:

class << Foo; self; end.instance_eval %q[
define_method:)zzz) { "zzz" }
]

And I wonder why instance_eval/class_eval do not matter when it comes
to define_method and alias_method. "ri define_method" gives me
"Defines an instance method in the receiver. The method parameter can
be a Proc or Method object. If a block is specified, it is used as the
method body."

So I guess instance_eval and class_eval set context, but the receiver
is always the one precedes the instance_eval and class_eval clause. As
an example,

Foo.instance_eval { # Foo is the receiver
# Interprets under the context of Foo object. Hence, add method to
Foo itself, resulting in class method.
def ...
end

# Because Foo is the receiver, an instance method is added to Foo.
define_method ...
}

On the other hand,

class << Foo; self; end.class_eval { # Foo's metaclass(I'll denote
this as (Foo) fron now on) is the receiver
# Interprets treating (Foo) as a class. Hence, Foo's class method
like Foo.bar is generated.
def ...
end

# Because (Foo) is the receiver, an instance method is added to
(Foo). And this means
# methods are added to Foo which is the instance of (Foo).
define_method ...
}

Did I miss anything? Please verify whether my reasoning is correct.

Sincerely Yours,
Minkoo Seo
 
P

Pit Capitain

Minkoo said:
I have a question on the semantics of define_method and alias_method.
Let me start with class_eval and instance_eval. (...)

Hi. Have you seen [ruby-talk:207801]? Does it answer you questions? If
not, feel free to ask again.

Regards,
Pit
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,968
Messages
2,570,153
Members
46,699
Latest member
AnneRosen

Latest Threads

Top