Метки тегов в модуле для справки из классов смешивания
У меня есть модуль 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
Не уверен, что это сработает для вас.