"enum"のようなものを作ろうとしています。ここに私の実装です:Ruby Gurusに関する質問(Enumのような実装に役立つ)
# Format of input hash to AnEnum::initialize is :
# {
# Symbol => [Fixnum => String]
# }
# Example:
# {
# :active => [1 => "Active"]
# }
class AnEnum
@@values = nil
def initialize(hash)
@@values = hash
end
def values
@@values
end
def [](symbol)
values[symbol][0] # return the number for the symbol. e.g. 1
end
def text(symbol)
values[symbol][1] # return the text for the symbol. e.g. "Active"
end
end
使用例:
class MyClass1
@@status = AnEnum.new({
:open => [1, 'Active'],
:closed => [2, 'Closed']
})
def self.Status
@@status
end
end
# test it (it works!)
MyClass1.Status[:open] # => 1
MyClass1.Status.text(:open) # => "Active"
これは動作しますが、私はそれがより多くの「エレガント」と「ダイナミック」にしたい:
がAnEnum
を定義することが可能ですMyClass2
のように:
class MyClass2
define_enum "Status", :as => {
:open => [1, 'Active'],
:closed => [2, 'Closed']
}
end
これらが動作するように:
MyClass2.Status[:open] # => 1
MyClass2.Status.text(:open) # => "Active"
したがって、上記MyClass1
で定義さ@@status
とself.Status
が自動的define_enum
に呼び出す様「マクロ」によってクラスに含まれます。
define_enum
は、たとえばbefore_filter
Railsでの呼び出しのように機能するように意図されています。
これは可能ですか?
"Rubyの達人のための質問" の部分は、任意の有用な情報を提供していません。タグは、それがルビーであることを示しているので、SOのすべてが質問でなければならず、あなたはガウスが役に立たないだけでいいと言っています。 –