Мне нужно знать, если есть способ выполнить что-то каждый раз, когда я определяю класс - PullRequest
1 голос
/ 21 апреля 2019

Как я сказал в заголовке. Мне нужно знать, есть ли способ выполнить что-то каждый раз, когда я определяю класс

лайк ставит "фифи".

Когда я делаю это:

class Pipipupu
end

=> fifi

Ответы [ 2 ]

1 голос
/ 21 апреля 2019
class Object
  def self.inherited(obj)
    puts "fifi" if obj == Pipipupu
  end
end

class Pipipupu
end

diplays "fifi".

class Cat
end

ничего не отображает.См. Class # унаследованный , который называется callback или hook метод.

Если вы хотите отображать "fifi" всякий раз, когда любойкласс создан замените

puts "fifi" if obj == Pipipupu

на

puts "fifi" if obj.is_a? Class
0 голосов
/ 21 апреля 2019

Добавить inherited хук к BasicObject:

class BasicObject
  def self.inherited(subclass)
    puts "fifi"
  end
end

Чтобы не допустить путаницы других хуков, вместо переопределения вы можете добавить модуль, который печатает и вызывает super, чтобы вызвать ужезарегистрированное поведение:

module Hook
  def inherited(subclass)
    puts "fifi"
    super
  end
end

BasicObject.singleton_class.prepend(Hook)

Затем:

irb> class Foo; end
fifi
=> nil

Либо добавьте хук к Object.Для Foo выше неявный суперкласс равен Object.Но BasicObject является суперклассом Object.Добавление ловушки к BasicObject также будет печатать для классов, которые указывают BasicObject как суперкласс.

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