动态对象创建和const_set

时间:2012-02-05 19:56:14

标签: ruby

我正在尝试创建枚举 - 就像java模拟。我有这个模块。

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

我做错了什么?

1 个答案:

答案 0 :(得分:2)

如果obj.is_a? CC的类,或者obj的类包含的模块,或{{1}类的超类之一,则

obj为真{1}}。它用于实例,而不是子类

obj

如果您想知道是否是另一个给定类的子类,只需使用class A; end class B < A; end b = B.new b.is_a? A # => true