LoginSignup
7
9

More than 5 years have passed since last update.

Ruby | Ruby で Java の列挙型(Enum)を使いたい場合

Posted at

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
7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9