Динамическое создание объектов и const_set - PullRequest
0 голосов
/ 05 февраля 2012

Я пытаюсь создать enum-подобный аналог 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 Ответ

2 голосов
/ 06 февраля 2012

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?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...