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
#-------------

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

回答の条件
  • 1人5回まで
  • 登録:2007/03/30 13:33:19
  • 終了:2007/04/02 13:42:04

ベストアンサー

id:Bookmarker No.1

しおり回答回数191ベストアンサー獲得回数342007/03/30 15:15:03

ポイント50pt

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
id:takel

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

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

2007/03/30 15:29:13

その他の回答(1件)

id:Bookmarker No.1

しおり回答回数191ベストアンサー獲得回数342007/03/30 15:15:03ここでベストアンサー

ポイント50pt

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
id:takel

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

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

2007/03/30 15:29:13
id:russian-blue No.2

russian-blue回答回数36ベストアンサー獲得回数02007/03/30 18:42:50

ポイント50pt

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]

id:takel

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

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

class TriChar

  (

    XX_ABC,

    XX_DEF,

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

end

class Definition

  (

    XX_DEF,

    XX_UNDEF)=Array(0..1)

end

2007/03/31 16:37:05
  • id:Bookmarker
    http://d.hatena.ne.jp/Bookmarker/20070402/1175494823
    使い易いようにメソッドにしてみました。また、C/C++ 相当の機能と、C/C++ にも無い機能を追加してみました。
    良かったらどうぞ。
  • id:takel
    Bookmarker様
    コメント頂いていた事に気づくのが遅れました!
    作っていただけたんですね、感激です。
    これから使わせて頂きます。ありがとうございました!

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません