Метки тегов в модуле для справки из классов смешивания

У меня есть модуль M который я хочу отметить специальными методами как "специальные", чтобы классы, которые смешиваются в этом модуле, могли проверить, является ли данное имя метода специальным. Вот что я попробовал:

module M
  def specials
    @specials ||= {}
  end

  def self.special name
    specials[name] = true
  end

  def is_special? name
    specials[name]
  end

  def meth1
    ...
  end
  special :meth1
end

class C
  include M

  def check name
    is_special? name
  end
end

Конечно, это не работает, потому что я не могу вызвать метод экземпляра из метода класса self.special, Я подозреваю, что если я хочу сохранить возможность звонить special :<name> ниже требуемых методов в модуле, у меня нет выбора, кроме как использовать переменные класса (например, @@specialsМожет кто-нибудь докажет, что я не прав?

1 ответ

Вы можете сделать все эти методы методами класса и сделать следующее:

module M
  def self.specials
    @specials ||= {}
  end

  def self.special name
    self.specials[name] = true
  end

  def self.is_special? name
    self.specials[name]
  end

  def meth1
    'foo'
  end

  def meth2
    'bar'
  end

  special :meth1
end

class C
  include M

  def check name
    M.is_special? name
  end
end

p C.new.check(:meth1)
#=> true
p C.new.check(:meth2)
#=> nil

Не уверен, что это сработает для вас.

Другие вопросы по тегам