窓際BLOG

プログラミングの学習メモや書籍の感想等を公開していきます。

Ruby:Rubyでenum(列挙型)を使う※おまけ:全ての定数の値を取得する方法

下記ツールRubyenum(列挙型)を使いたかったけど、Rubyには明確な列挙型のようなクラスが無く、少しハマったのでφ(..)メモメモ

github.com

Rubyenum(列挙型)を使うには

Rubyにはenumがありません。そのためmoduleを使ってenumを表現します。
下記のように複数の定数値をmoduleの中に定義することで、enumのような振る舞いをさせることが出来ます!

# 定数のため、変更が入らないように`.freeze`を記載しています。
module Lang
  ENG = 'en'.freeze
  JPN = 'ja'.freeze
end

定数値を呼び出すにはモジュール名::定数名というような形で記述します。

puts Lang::ENG
# 結果 : en
puts Lang::JPN
# 結果 : ja

おまけ:全ての定数の値を取得する

moduleクラスに全ての定数値の値を取得するようなメソッドが無さそうだったので、自分で作ってみました。 constantsで全ての定数値の変数名を取得し、それを使ってevalで値を取得し直して配列で返しています。
moduleで定義した定数のリストに属さない入力値のチェック等に使えるのではないかなと思いますφ(..)

module Lang
  ENG = 'en'.freeze
  JPN = 'ja'.freeze

  def self.all_lang
    result = []
    self.constants.each{ |lang| eval("result << #{lang}") }
    result
  end
end

↓動作確認はこちら

参考

qiita.com

以上