James Coglan
8/21/2008 1:32:00 PM
[Note: parts of this message were removed to make it a legal post.]
> Hello,
>
> i just wondered where the difference between the following code parts is?
>
> ---- code ----
>
> class << Array
> p self.inspect
> define_method :foo do
> p "inside foo"
> end
> end
>
> Array.class.module_eval do
> p self.inspect
> define_method :bar do
> p "inside bar"
> end
> end
>
> Array.foo
> Array.bar
>
> ---- output ----
>
> "#<Class:Array>"
> "Class"
> "inside foo"
> "inside bar"
>
Array.class is equal to Class -- all classes are instances of Class. So, the
second one actually adds an instance method :bar to Class, so *all* classes
get that method:
String.bar
#=> "inside bar"
If you only want to modify Array, leave out the '.class'
Array.module_eval do
p self.inspect #=> "Array"
def self.bar
"inside class method bar"
end
def bar
"inside instance method bar"
end
end
Array.bar
#=> "inside class method bar"
[].bar
#=> "inside instance method bar"
or try the following...
(class << Array; self; end).module_eval do
p self.inspect
define_method :bar do
p "inside bar"
end
end