Я пытаюсь сделать что-то вроде "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"
Таким образом, определены @@status
и self.Status
в MyClass1
и выше автоматически включаются в класс при помощи «макро» -подобного вызова define_enum
.
define_enum
предназначен для работы подобно тому, как, например, вызов before_filter
в Rails.
Возможно ли это?