# Where is my Class?

**URL:** <https://www.ruby-forum.com/t/where-is-my-class/88770>\
**Category:** Ruby\
**Created:** [March 14, 2007, 8:13am UTC](https://www.ruby-forum.com/t/where-is-my-class/88770 "2007-03-14T08:13:44Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![sur](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c57346/32.png) [@sur](https://www.ruby-forum.com/u/sur)\
**Post date:** [March 14, 2007, 8:13am UTC](https://www.ruby-forum.com/t/where-is-my-class/88770/1 "2007-03-14T08:13:44Z")

</div>

Hi all,

There isn’t any way to have a class name starting with lowercase letter.

I was trying it as

class a  
end

# SyntaxError: compile error

# class/module name must be CONSTANT

so then i tried

a = Class.new

# #Class:0x2de1f00

this shows that “a” is now a reference to the class #Class:0x2de1f00  
the Class object

and  
B = Class.new

# B

that works absolutely fine.

The point is if we try to assign as

B=a  
it gives

# warning: already intialized constant B … thats fine

but  
and now if i check a as

a

# B

so where is the original class of a that was #Class:0x2de1f00 … and  
how  
come the assignment happens from RIGHT-to-LEFT ?

any idea ?

---

<div class="post-metadata">

**Author:** ![sur](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c57346/32.png) [@sur](https://www.ruby-forum.com/u/sur)\
**Post date:** [March 14, 2007, 8:18am UTC](https://www.ruby-forum.com/t/where-is-my-class/88770/2 "2007-03-14T08:18:45Z")

</div>

assignment happened LEFT-to-RIGHT

---

<div class="post-metadata">

**Author:** ![sur](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c57346/32.png) [@sur](https://www.ruby-forum.com/u/sur)\
**Post date:** [March 14, 2007, 8:53am UTC](https://www.ruby-forum.com/t/where-is-my-class/88770/3 "2007-03-14T08:53:49Z")

</div>

sur max schrieb:

> > # warning: already intialized constant B … thats fine
> > 
> > any idea ?

sur max, you still have the same class, accessible via both a and B:

a = Class.new # =\> #Class:0x310b640  
a.object\_id # =\> 25713440

B = Class.new # =\> B  
B.object\_id # =\> 25706400

B = a # warning: already initialized constant B  
# =\> B  
a # =\> B  
a.object\_id # =\> 25713440  
B.object\_id # =\> 25713440

The reason is that Ruby uses the name of the first constant a class  
object is assigned to as the class’ name:

X = Class.new # =\> X  
Y = X # =\> X  
Y # =\> X

In your case, you created an “anonymous” class without assigning it to a  
constant, so it doesn’t have a name yet. After assigning this anonymous  
class to the constant B, you get the warning, but nethertheless the  
constant is changed to reference the previous anonymous class. After the  
assignment, the class isn’t anonymous anymore, it has got the name “B”.

This way you can create multiple classes with the same name:

c1 = Class.new # =\> #Class:0x30f60c4  
c2 = Class.new # =\> #Class:0x30f3aa4

C = c1 # =\> C  
C = c2 # warning: already initialized constant C  
# =\> C

c1 # =\> C  
c2 # =\> C

They still are distinct classes, though.

c1.object\_id # =\> 25669730  
c2.object\_id # =\> 25664850

Regards,  
Pit

---

<div class="post-metadata">

**Author:** ![sur](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c57346/32.png) [@sur](https://www.ruby-forum.com/u/sur)\
**Post date:** [March 14, 2007, 9:52am UTC](https://www.ruby-forum.com/t/where-is-my-class/88770/4 "2007-03-14T09:52:57Z")

</div>

The first time an anonymous class is assigned to a constant, its name  
changes to be the constant’s. You can check that everything works as you  
expected by doing

puts a.object\_id  
puts b.object\_id

---

<div class="post-metadata">

**Author:** ![sur](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c57346/32.png) [@sur](https://www.ruby-forum.com/u/sur)\
**Post date:** [March 14, 2007, 9:59am UTC](https://www.ruby-forum.com/t/where-is-my-class/88770/5 "2007-03-14T09:59:57Z")

</div>

Hi Pit,

from your explanation and my perception too it seems that we are not  
able to  
write anything in the constants once they defined.  
Look at this then…

B=Class.new # B

B.module\_eval{define\_method :foo do; puts “foo here”; end} #  
#Proc:0x02deeb18@:3(irb)

B.instance\_methods.include?(“foo”) # true

B. **id** # 24100884

a=Class.new # Class:0x2de7978

a.module\_eval{define\_method :bar do; puts “bar here”; end}  
#Proc:0x02de2920@:7(irb)

a. **id** # 24067260

a.instance\_methods.include?(“foo”) # false

a.instance\_methods.include?(“bar”) # true

B=a # warning: already initialized constant B  
=\> B

a.instance\_methods.include?(“bar”) # true

a.instance\_methods.include?(“foo”) # false

B.instance\_methods.include?(“foo”) # false

B.instance\_methods.include?(“bar”) # true

B. **id** # 24067260

B. **id** ==a. **id** # true

this means that the Class B is overwritten by the Class referenced by  
“a”  
so it is the case of changing a constant. Is that possible ?

---

<div class="post-metadata">

**Author:** ![sur](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c57346/32.png) [@sur](https://www.ruby-forum.com/u/sur)\
**Post date:** [March 14, 2007, 8:06pm UTC](https://www.ruby-forum.com/t/where-is-my-class/88770/6 "2007-03-14T20:06:59Z")

</div>

Hi Pit,  
Thanks a lot for explaining.

---

<div class="post-metadata">

**Author:** ![sur](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c57346/32.png) [@sur](https://www.ruby-forum.com/u/sur)\
**Post date:** [March 14, 2007, 10:45am UTC](https://www.ruby-forum.com/t/where-is-my-class/88770/7 "2007-03-14T10:45:04Z")

</div>

sur max schrieb:

> (…)  
> B=a # warning: already initialized constant B  
> (…)  
> this means that the Class B is overwritten by the Class referenced by “a”  
> so it is the case of changing a constant. Is that possible ?

No, no objects are overwritten in Ruby. An assignment like

var = obj

just makes the object on the right (obj) accessible via the name on the  
left (var). The line

B = a

makes the object referenced by a (the anonymous class) accessible via  
the name B. After this, a and B are different names for the same object.  
The previous object referenced by the name B is still around (until the  
garbage collector reclaims it) and not changed at all.

In Ruby, constants, instance, and local variables are only names for  
objects. Constants have the additional property that they are intended  
to be assigned to only once. If you re-assign a constant, you get a  
warning, but the assignment happens nonetheless. Try this with something  
different than anonymous classes and it might be easier to understand.

There have been many discussions about variable names and objects on  
this mailing list. You can also look at

[http://onestepback.org/index.cgi/Tech/Ruby/Shoeboxes.rdoc](http://onestepback.org/index.cgi/Tech/Ruby/Shoeboxes.rdoc)

Regards,  
Pit
