ちなみに

火曜日の空は僕を押しつぶした。

列挙型クラスを書いてみた

Rubyで列挙型っぽいことをしたい場合は、定数とかシンボルを使うのだと思うのだけれど、もっと列挙型っぽく扱いたかったので、練習もかねて書いてみた。しかし、実用性無視なので普通に定数とか使った方がいい気がする。

class Enumeration
  def initialize(*enum)
    enum.each do |item|
      instance_variable_set "@#{item.to_s.downcase}", Object.new
    end
    freeze
  end

  def method_missing(name, *arg)
    instance_variable_get "@#{name.to_s.downcase}" or
      raise NameError, "No such item in enumeration: #{name}"
  end

  def inspect
    "{ #{instance_variables.reverse.
      join(' ').gsub(/@/, '').upcase} }"
  end
end

(追記: かなり削ったので原形を留めてない。gistに貼っとけば良かった => quickrunの弊害)

以下の様にして使う

STYLE = Enumeration.new :BOLD, :ITALIC, :NORMAL
p STYLE.BOLD == STYLE.BOLD
#=> true
p STYLE.BOLD == STYLE.ITALIC
#=> false
p STYLE.BOLD == STYLE.bold
#=> true
p STYLE
#=> { BOLD ITALIC NORMAL }

実に扱いにくい...。


# もっと奇麗に扱いたいので、定石などがあれば教えてください><(それが目的)