Ruby | Ruby で Java の列挙型(Enum)を使いたい場合
概要
Ruby で Java の列挙型(Enum)を使いたい場合について。
Javaで、特定の概念の定数の集まりを扱う場合 Enum が便利です。
例えば、信号に係る赤・青・黄の色を管理する場合、バラバラの定数として扱うよりも
Enum として利用した方が意図が伝わる上に不正な値を受け付けなくなります。
sample.java
enum SignalColors { RED, GREEN, YELLOW; }
Rubyは組み込みでJavaの列挙型(Enum)のようなものは用意されていないので
別の方法で代替する必要があります。
モジュールを利用した擬似Enum
この方法が王道なのかわかりませんがある程度似たような実装ができます。
require 'tbpgr_utils'
require 'forwardable'
module Enum
def values
constants.map{ |e| const_get(e) }
end
def keys
constants
end
end
module Janken
extend Enum
extend Forwardable
GU = 0
CHOKI = 1
PA = 2
def_delegators :keys, :values
end
bulk_puts_eval binding, <<-EOS
Janken::GU
Janken::CHOKI
Janken::PA
Janken.keys
Janken.values
EOS
# 不正値の検出
begin
Janken::SUPER
rescue => e
puts e
end
__END__
下記はTbpgrUtils gemの機能
bulk_puts_eval
https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils
出力
Janken::GU # => 0
Janken::CHOKI # => 1
Janken::PA # => 2
Janken.keys # => [:GU, :CHOKI, :PA]
Janken.values # => [0, 1, 2]
uninitialized constant Janken::SUPER