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 }
実に扱いにくい...。
# もっと奇麗に扱いたいので、定石などがあれば教えてください><(それが目的)