# Ruby enums in C

**URL:** <https://www.ruby-forum.com/t/ruby-enums-in-c/78708>\
**Category:** Ruby\
**Created:** [December 8, 2006, 12:01am UTC](https://www.ruby-forum.com/t/ruby-enums-in-c/78708 "2006-12-08T00:01:22Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![joe-dumoulin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9dc877/32.png) [@joe-dumoulin](https://www.ruby-forum.com/u/joe-dumoulin)\
**Post date:** [December 8, 2006, 12:01am UTC](https://www.ruby-forum.com/t/ruby-enums-in-c/78708/1 "2006-12-08T00:01:22Z")

</div>

Each instance of Joe has a MOOD which can be HAPPY, SAD, or NEUTRAL.

The Joe class is written in C. In C, what’s the appropriate way for  
setting MOOD to one of the appropriate values?

Thanks,  
An instantiated Joe object

---

<div class="post-metadata">

**Author:** ![joe-dumoulin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9dc877/32.png) [@joe-dumoulin](https://www.ruby-forum.com/u/joe-dumoulin)\
**Post date:** [December 8, 2006, 12:05am UTC](https://www.ruby-forum.com/t/ruby-enums-in-c/78708/2 "2006-12-08T00:05:23Z")

</div>

On Dec 7, 2006, at 14:59 , Joe Van D. wrote:

> Each instance of Joe has a MOOD which can be HAPPY, SAD, or NEUTRAL.
> 
> The Joe class is written in C. In C, what’s the appropriate way for  
> setting MOOD to one of the appropriate values?

rb\_iv\_set(joe, “@mood”, rb\_intern(“sad”));

–  
Eric H. - removed\_email\_address@domain.invalid - [http://blog.segment7.net](http://blog.segment7.net)

I LIT YOUR GEM ON FIRE!

---

<div class="post-metadata">

**Author:** ![joe-dumoulin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9dc877/32.png) [@joe-dumoulin](https://www.ruby-forum.com/u/joe-dumoulin)\
**Post date:** [December 8, 2006, 12:06am UTC](https://www.ruby-forum.com/t/ruby-enums-in-c/78708/3 "2006-12-08T00:06:24Z")

</div>

Joe Van D. wrote:

> Each instance of Joe has a MOOD which can be HAPPY, SAD, or NEUTRAL.
> 
> The Joe class is written in C. In C, what’s the appropriate way for  
> setting MOOD to one of the appropriate values?
> 
> Thanks,  
> An instantiated Joe object

[http://www.google.com/search?hl=en&q=constants+in+C&btnG=Google+Search](http://www.google.com/search?hl=en&q=constants+in+C&btnG=Google+Search)

---

<div class="post-metadata">

**Author:** ![joe-dumoulin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9dc877/32.png) [@joe-dumoulin](https://www.ruby-forum.com/u/joe-dumoulin)\
**Post date:** [December 8, 2006, 12:35am UTC](https://www.ruby-forum.com/t/ruby-enums-in-c/78708/4 "2006-12-08T00:35:27Z")

</div>

On 12/7/06, Jeremy W. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Joe Van D. wrote:
> 
> > Each instance of Joe has a MOOD which can be HAPPY, SAD, or NEUTRAL.
> > 
> > The Joe class is written in C. In C, what’s the appropriate way for  
> > setting MOOD to one of the appropriate values?
> > 
> > Thanks,  
> > An instantiated Joe object
> 
> [constants in C - Google Search](http://www.google.com/search?hl=en&q=constants+in+C&btnG=Google+Search)

Is there much difference between using a C constant for that, and  
using a Ruby instance variable (like how Mr. Hodel did)?

---

<div class="post-metadata">

**Author:** ![joe-dumoulin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9dc877/32.png) [@joe-dumoulin](https://www.ruby-forum.com/u/joe-dumoulin)\
**Post date:** [December 8, 2006, 1:39am UTC](https://www.ruby-forum.com/t/ruby-enums-in-c/78708/5 "2006-12-08T01:39:33Z")

</div>

On Dec 7, 2006, at 15:34 , Joe Van D. wrote:

> > > An instantiated Joe object
> > 
> > [constants in C - Google Search](http://www.google.com/search?hl=en&q=constants+in+C&btnG=Google)  
> > +Search
> 
> Is there much difference between using a C constant for that, and  
> using a Ruby instance variable (like how Mr. Hodel did)?

A C constant takes more work to expose to Ruby. You have to map that  
opaque integer into something sensible, and then you have uglier code.

#define JOE\_SAD -1  
#define JOE\_NEUTRAL 0  
#define JOE\_HAPPY 1

/\* … \*/  
rb\_define\_const(cJoe, “HAPPY”, INT2FIX(JOE\_HAPPY));

if Joe.state == Joe::HAPPY then … end

A Symbol in an instance variable gives you zero extra work, allows  
for easier debugging on the Ruby side and gives you prettier code.

if Joe.state == :happy then … end

–  
Eric H. - removed\_email\_address@domain.invalid - [http://blog.segment7.net](http://blog.segment7.net)

I LIT YOUR GEM ON FIRE!
