人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Ruby で C や C++ の enum 相当の事を行いたいです。
過去質問にも似た物があったのですが、私の求めている回答とは違うと思われる回答しかついていませんでした。

下記のような物をもっとスマートにする方法を知りたいです。

#---------------------------------
class TriChar
XX_ABC = 0
XX_DEF = 1
XX_GHI = 2
# このように数値がかぶらないようにふられるように
end

class Definition
XX_DEF = 0
XX_UNDEF = 1
# ちゃんとスコープに収まる
end

TriChar::XX_DEF != Definition::XX_DEF # <- これが true になる
#---------------------------------


私の望んでいる事を C 風に書くと


#---------------------------------
class TriChar
enum
{
XX_ABC,
XX_DEF,
XX_GHI,
}; # 何も書かなければ連番が自動でふられる
end

class Definition
enum XX # <- 型として定義できなくてもいいですができてもいいです
{
XX_DEF,
XX_UNDEF,
};
end
#-------------

このような感じです。
宜しくお願いします。

●質問者: Takel
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:C++ Class enum Ruby スコープ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● しおり
●50ポイント ベストアンサー

C/C++ の enum 相当とまではいきませんが、単純に連番を振るだけなら以下のようなコードでどうでしょうか。

class TriChar
 i = 0
 %w(XX_ABC XX_DEF XX_GHI).each do |name|
 const_set(name, i)
 i += 1
 end
end

class Definition
 i = 0
 %w(XX_DEF XX_UNDEF).each do |name|
 const_set(name, i)
 i += 1
 end
end

p TriChar::XX_ABC# => 0
p TriChar::XX_DEF# => 1
p TriChar::XX_GHI# => 2

p Definition::XX_DEF# => 0
p Definition::XX_UNDEF# => 1

p TriChar::XX_DEF != Definition::XX_DEF# => true
◎質問者からの返答

私のまだ知らない構文もありますが、ほぼ想定していた通りの使い方ができました。

ありがとうございます!!


2 ● russian-blue
●50ポイント

class TriChar

(XX_ABC,XX_DEF,XX_GHI)=Array(1..3)

end

class Definition

(XX_DEF,XX_UNDEF)=Array(0..1)

end

各種初期化

(XX_ABC,XX_DEF,XX_GHI)=Array(1..99)

(XX_ABC,XX_DEF,XX_GHI)=1,5,10

XX_ABC,XX_DEF,XX_GHI=1,5,10

(XX_ABC,XX_DEF,XX_GHI)=[1,5,10]

◎質問者からの返答

複数行にわけた時に少し不恰好になってしまうのが少し残念ですがシンプルでいいですね。

もう少しブレイスの位置のバランスを綺麗に書けたらものすごく良かったのですが…

class TriChar

(

XX_ABC,

XX_DEF,

XX_GHI)=Array(0..32767) # 要確認:最大値を大きくとると要素数もそれだけ大きくなってしまうのか?

end

class Definition

(

XX_DEF,

XX_UNDEF)=Array(0..1)

end

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ