From: "Ara.T.Howard" Date: 2005-08-03T01:50:26+09:00 Subject: Re: enum collection of constant values On Wed, 3 Aug 2005, Garance A Drosehn wrote: > I'd like to have a set of constants for a class, where their values > need to be unique, and preferably compact. For instance: > SB_NONE = 0; SB_GOOD = 1; SB_BAD = 2; SB_LOGIC_ERR = 3; > SB_MAX = SB_LOGIC_ERR > > but if I want to modify this list by adding something in the middle, > then I have to remember to increment (by hand) all the values > which come after that new value. > > In C, I would do something like: > typedef enum { SB_NONE, SB_GOOD, SB_BAD, > SB_LOGICERR } sb_set; > > Looking through the pickaxe book, it looks like the closest thing > I can do is to create an array of words, and then use the indexes > of where those words are in the array. But that isn't really the > same thing. I'd like the efficiency of having constant values, > which would be referred to by name. > > (And after I have that for a compact set of values, I'd want a > similar feature which would give me a bit-wise unique set of > values. Eg: SB_MODA = 1; SB_MODB = 2; SB_MODC = 4; > SB_MODD = 8; -- such that I could combine the values together > using '|', and tell which values were 'or'-ed together to get that > combined value...) > > -- > Garance Alistair Drosehn = drosihn@gmail.com > Senior Systems Programmer or gad@FreeBSD.org > Rensselaer Polytechnic Institute; Troy, NY; USA class methods are your friend harp:~ > cat a.rb module Enum def self::included other other.module_eval do def self::enum(*list) list.flatten.each_with_index{|e, i| const_set e.to_s.intern, i} end def self::bit_enum(*list) list.flatten.each_with_index{|e, i| const_set e.to_s.intern, 2 ** i} end end end end class C include Enum enum %w( FOO BAR FOOBAR BARFOO ) end class B include Enum bit_enum %w( FOO BAR FOOBAR BARFOO ) end p C::FOO p C::BARFOO printf "0b%8.8b\n", B::FOO printf "0b%8.8b\n", B::BARFOO harp:~ > ruby a.rb 0 3 0b00000001 0b00001000 cheers. -a -- =============================================================================== | email :: ara [dot] t [dot] howard [at] noaa [dot] gov | phone :: 303.497.6469 | My religion is very simple. My religion is kindness. | --Tenzin Gyatso ===============================================================================