2012-02-05 63 views
0

我想创建枚举类似java模拟。我有这个模块。动态对象创建和const_set

module Enum 

    def self.included(base) 
    super 
    base.extend(Enum) 
    base.private_class_method :new 
    end 

    def enum(key, fields = {}, &class_body) 

    value = Class.new(self) do 
     fields.each_with_index do |item, i| 
     define_singleton_method(item.first.to_s.downcase) { item.last } 
     define_singleton_method("order") { i } 
     end 
    end 

    self.const_set key, value   
    end 

end 

class TestEnum 
    include Enum 

    enum :TEST, value: 1 
end 

当我试图

>> TestEnum::TEST.is_a? TestEnum 
false <- 

我这有。为什么?我期望看到'真实'。 但

>> TestEnum::TEST.ancestors 
TestEnum::TEST.ancestors 
[TestEnum::TEST, TestEnum, Enum, Object 

我在做什么错了?

+0

你的用例是什么?如果仅仅是定义一个枚举,你可以使用带符号的Set。 – Confusion 2012-02-05 20:39:16

回答

2

obj.is_a? C为真,如果C是类的obj,或通过obj的类,或之类的obj的超类的一个包括的模块。它用于实例,而不是子类

class A; end 
class B < A; end 
b = B.new 
b.is_a? A # => true 

如果你想知道,如果一个是另一个给定类的子类,只需使用ancestors.include?