# Dynamically assigning class constants

**URL:** <https://www.ruby-forum.com/t/dynamically-assigning-class-constants/147849>\
**Category:** Ruby\
**Created:** [September 6, 2008, 1:43am UTC](https://www.ruby-forum.com/t/dynamically-assigning-class-constants/147849 "2008-09-06T01:43:31Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![moredip](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/bbce88/32.png) [@moredip](https://www.ruby-forum.com/u/moredip)\
**Post date:** [September 6, 2008, 1:43am UTC](https://www.ruby-forum.com/t/dynamically-assigning-class-constants/147849/1 "2008-09-06T01:43:31Z")

</div>

Hi folks,

I have a class definition as follows:

class Level  
attr\_reader :name, :rank  
def initialize( name, rank )  
@name, @rank = name, rank  
end

```
TRACE = Comparable.new( :TRACE, 1000 )
DEBUG = Comparable.new( :DEBUG, 2000 )
INFO = Comparable.new( :INFO, 3000 )
# etc

```

end

and I’d like to define the constants in a more ruby-esque way; something  
like:

class Level  
attr\_reader :name, :rank  
def initialize( name, rank )  
@name, @rank = name, rank  
end

```
%w{TRACE DEBUG INFO CHANGE WARN ERROR FATAL}.each_with_index do 

```

|name,i|  
clever\_dynamic\_hackery( name, Comparable.new( name.to\_sym, i\*1000  
) )  
end

end

but I don’t know what that clever\_dyanamic\_hackery method should  
actually be. Any one want to show me the light?

Cheers,  
Pete

---

<div class="post-metadata">

**Author:** ![moredip](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/bbce88/32.png) [@moredip](https://www.ruby-forum.com/u/moredip)\
**Post date:** [September 6, 2008, 1:52am UTC](https://www.ruby-forum.com/t/dynamically-assigning-class-constants/147849/2 "2008-09-06T01:52:18Z")

</div>

Apologies, s/Comparable/Level/ in the example code.

---

<div class="post-metadata">

**Author:** ![moredip](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/bbce88/32.png) [@moredip](https://www.ruby-forum.com/u/moredip)\
**Post date:** [September 6, 2008, 3:28am UTC](https://www.ruby-forum.com/t/dynamically-assigning-class-constants/147849/3 "2008-09-06T03:28:12Z")

</div>

module M  
%w(FOO BAR BAZ).each do |c|  
const\_set(c, 1)  
end  
end

---

<div class="post-metadata">

**Author:** ![moredip](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/bbce88/32.png) [@moredip](https://www.ruby-forum.com/u/moredip)\
**Post date:** [September 6, 2008, 3:19am UTC](https://www.ruby-forum.com/t/dynamically-assigning-class-constants/147849/4 "2008-09-06T03:19:25Z")

</div>

there might be a method for specifically creating constants,but if not  
you could always do something like this:

module\_eval("#{name} = #{i\*1000}", **FILE** , **LINE** )

---

<div class="post-metadata">

**Author:** ![moredip](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/bbce88/32.png) [@moredip](https://www.ruby-forum.com/u/moredip)\
**Post date:** [September 6, 2008, 3:37am UTC](https://www.ruby-forum.com/t/dynamically-assigning-class-constants/147849/5 "2008-09-06T03:37:34Z")

</div>

Wonderful, thank you Xavier!
