# Class \<\< Array vs. Array.class

**URL:** <https://www.ruby-forum.com/t/class-array-vs-array-class/146473>\
**Category:** Ruby\
**Created:** [August 21, 2008, 3:22pm UTC](https://www.ruby-forum.com/t/class-array-vs-array-class/146473 "2008-08-21T15:22:29Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![requiem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e9bcb4/32.png) [@requiem](https://www.ruby-forum.com/u/requiem)\
**Post date:** [August 21, 2008, 3:22pm UTC](https://www.ruby-forum.com/t/class-array-vs-array-class/146473/1 "2008-08-21T15:22:29Z")

</div>

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”

---- end ----

it obviously makes a difference because self.inspect returns two  
different values. but how is this practically relevant?

Greetings,  
Niklas

---

<div class="post-metadata">

**Author:** ![requiem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e9bcb4/32.png) [@requiem](https://www.ruby-forum.com/u/requiem)\
**Post date:** [August 21, 2008, 3:35pm UTC](https://www.ruby-forum.com/t/class-array-vs-array-class/146473/2 "2008-08-21T15:35:26Z")

</div>

2008/8/21 Niklas B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> end  
> Array.bar
> 
> it obviously makes a difference because self.inspect returns two different values. but how is this practically relevant?

“class \<\< Array” opens the eigenclass of the Array object.  
Thus the foo method is only defined for the Array object itself.

“Array.class” returns the class of the Array object, which is Class.  
Defining a method with module\_eval in there means that it  
is defined for _all_ class objects.

To demonstrate this, try to call the methods on another class:

```
irb(main):017:0> String.foo
NoMethodError: undefined method `foo' for String:Class
        from (irb):17
irb(main):018:0> String.bar
"inside bar"

```

Stefan

---

<div class="post-metadata">

**Author:** ![requiem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e9bcb4/32.png) [@requiem](https://www.ruby-forum.com/u/requiem)\
**Post date:** [August 21, 2008, 3:36pm UTC](https://www.ruby-forum.com/t/class-array-vs-array-class/146473/3 "2008-08-21T15:36:36Z")

</div>

> end  
> 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

---

<div class="post-metadata">

**Author:** ![requiem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e9bcb4/32.png) [@requiem](https://www.ruby-forum.com/u/requiem)\
**Post date:** [August 21, 2008, 3:38pm UTC](https://www.ruby-forum.com/t/class-array-vs-array-class/146473/4 "2008-08-21T15:38:57Z")

</div>

Hello,

“Stefan L.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> NoMethodError: undefined method `foo' for String:Class
> from (irb):17
> irb(main):018:0> String.bar
> "inside bar"
> 
> ```
> 
> Stefan

thank you!

Greetings,  
Niklas
