[#40498] autoload SYMBOL, XX.rb — keiju@... (Keiju ISHITSUKA)
けいじゅ@いしつかです.
8 messages
2005/01/08
[#40501] getopt — keiju@... (Keiju ISHITSUKA)
けいじゅ@いしつかです.
6 messages
2005/01/08
[#40519] What is singletonclass.superclass ? — sheepman <sheepman@...>
こんにちは、sheepman です。
6 messages
2005/01/11
[#40523] Re: アクセス情報の取得について — yuushi44@...
酒匂様、神戸様
4 messages
2005/01/12
[#40546] Net::IMAPの中のinlenって何ですか? — 内木場 美次 <uchikoba@...>
はじめまして。Rubyを始めて2ヶ月ちょっとの
6 messages
2005/01/20
[#40551] Net::IMAPで既に存在するディレクトリが削除できない — 内木場 美次 <uchikoba@...>
お疲れ様です。内木場です。
13 messages
2005/01/21
[#40571] dupとfrozen — Chikara Takamatsu <c_takamatu@...>
始めまして。高松と申します。
5 messages
2005/01/25
[#40580] enum 定数する場合のイディオム — Hiroshi Takagi <gollum@...>
高木@関西のネットワーク屋%Ruby novice monk です。
12 messages
2005/01/27
[#40581] Re: enum 定数する場合のイディオム
— "U.Nakamura" <usa@...>
2005/01/27
こんにちは、なかむら(う)です。
[ruby-list:40583] Re: enum 定数する場合のイディオム
From:
Murayama Toshikiyo <murayama@...>
Date:
2005-01-27 08:12:56 UTC
List:
ruby-list #40583
村山@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においてもお勧めできません.