村山@Java屋です. オブジェクト指向的なENUMの話なんで横入り. > (どうも、頭が関数型から、なかなか脱却しない。。。) 以下で示すのはあくまでJavaでのやり方であり, おそらくRubyで使うには向いていません. > 複数のクラス定数ををC++ のenum みたいに記述したい場合、 > Ruby でスタンダードな・よく使われているイディオムってあるでしょうか? > Ruby では、こういう場合は、 > 引き方タイプごとにインスタンスメソッド化しちゃうことが多いでしょうから、 > あんまり、こういうケースにはでくわさないのでしょうか。 Javaの世界ではそのまま"Type Safe Enum"と呼ばれる有名なイディオムがあります. JDK1.5"Tiger"からは言語レベルでサポートされました. #詳しくはEffective Java 項目21「Enum構文をクラスで置き換える」参照. が,名前からも分かる通り,これは「(静的な)型安全性を保障するENUM」」 なんですね.またスクリプト言語の用途からすると書くのが面倒なだけの 無用の長物の可能性もあります. これはJavaでは有用でありながら,Rubyにはそのまま持って行くのが難しい イディオムの一つです.言語の違い(或いは用途の違い?)が設計の違いに繋がる 例として,興味深いと感じました. > class hoge > > Draw_grid, > Draw_rectangle, > Draw_top, > Draw_bottom, > Draw_left, > Draw_right = (0..5).to_a 簡単に言えばこんな感じです. class Hoge{ // コンストラクタをprivateにして,他クラスからのインスタンス化を禁止. private Hoge(){} public static final Hoge Draw_grid = new hoge(); public static final Hoge Draw_rectangle = new hoge(); public static final Hoge Draw_top = new hoge(); public static final Hoge Draw_bottom = new hoge(); public static final Hoge Draw_left = new hoge(); public static final Hoge Draw_right = new hoge(); // 数値が必要な場合はコンストラクタで設定するなど,若干の変更が加えられる. } 要するにENUMの個数分だけインスタンスを生成し,インスタンスの同一性比較を 使用するものです.異なる型で比較するとコンパイルエラーになるので,例えば Foo foo = foo.RED .... if( Hoge.Draw_grid == foo ){ // 本来は無意味な比較. // Draw_gridの処理. } というようなバグが発生しにくくなります. もちろん手間が増えるので,全てをこれで書くのはJavaにおいてもお勧めできません.