2012-02-05 76 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?