2007-04-02 [Ruby][定数][列挙]
■[Ruby][定数][列挙]C/C++ の enum 相当の機能
question:1175229198
使い易いようにメソッドにしてみた。また、C/C++ 相当の機能と、C/C++ にも無い機能を追加してみた。*1
constant.rb
#!ruby module Constant def self.enum_set(klass, names, init_val = 0) value = init_val.to_int names.each do |name| klass.const_set(name, value) value += 1 end end def self.enum_set_ex(klass, exprs, init_val = 0) value = init_val.to_int exprs.each do |expr| case expr when /\A([^=]+)\s*=\s*(.+)\Z/ value = klass.module_eval($2).to_int klass.const_set($1, value) else klass.const_set(expr, value) end value += 1 end end def self.enum_set_bit(klass, names, init_val = 1) value = init_val.to_int names.each do |name| klass.const_set(name, value) value <<= 1 end end end class Module def enum_const_set(names, init_val = 0) Constant.enum_set(self, names, init_val) end def enum_const_set_ex(exprs, init_val = 0) Constant.enum_set_ex(self, exprs, init_val) end def enum_const_set_bit(names, init_val = 1) Constant.enum_set_bit(self, names, init_val) end end
次のような感じで使える。
enum_const_set
require 'constant' class Foo enum_const_set %w[ XX_A XX_B XX_C ] end p Foo::XX_A # => 0 p Foo::XX_B # => 1 p Foo::XX_C # => 2
enum_const_set_ex
require 'constant' class Foo enum_const_set_ex %w[ XX_A XX_B XX_C=-2 XX_D XX_E=XX_B ] end p Foo::XX_A # => 0 p Foo::XX_B # => 1 p Foo::XX_C # => -2 p Foo::XX_D # => -1 p Foo::XX_E # => 1
enum_const_set_bit
require 'constant' class Foo enum_const_set_bit %w[ XX_A XX_B XX_C ] end p Foo::XX_A # => 1 = 0b0001 p Foo::XX_B # => 2 = 0b0010 p Foo::XX_C # => 4 = 0b0100
*1:私自身も昔作ろうとしたけど、当時はできなかった。
トラックバック - http://d.hatena.ne.jp/Bookmarker/20070402/1175494823
リンク元
- 48 http://search.yahoo.co.jp/search?p=C+++enum&search.x=1&fr=top_beta&tid=top_beta&ei=UTF-8
- 48 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GFRG,GFRG:2007-12,GFRG:ja&q=c/c+++%p
- 42 http://www.google.co.jp/search?hl=ja&q=ENUM+C++&lr=
- 37 http://www.google.co.jp/search?hl=ja&q=c+++enum&lr=
- 31 http://www.google.co.jp/search?q=c+++enum&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox
- 30 http://q.hatena.ne.jp/1175229198
- 28 http://search.yahoo.co.jp/search?p=C+++enum&ei=UTF-8&fr=top_v2&x=wrt
- 25 http://raa.ruby-lang.org/project/enum-const/
- 23 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=Qu2&q=stl_alloc.h&btnG=検索&lr=lang_ja
- 22 http://search.yahoo.co.jp/search?p=enum+C++&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8