ruby — есть ли способ добавить код для запуска после каждого определения метода

#ruby #metaprogramming

#ruby #метапрограммирование

Вопрос:

Я понимаю, что def является ключевым словом и не может быть переопределен.

Но есть ли способ вызвать метод, когда метод регистрируется в классе (передавая имя создаваемого метода?)

Ответ №1:

Для этого и Module#method_added предназначен метод hook:

 module Foo
  def self.method_added(meth)
    p meth
  end

  def bar; end
end

# :bar
  

Комментарии:

1. Так будет ли это печатать имя каждого метода, который был добавлен в класс, в котором это было смешано?

Ответ №2:

Для создания микширования с этим хуком:

 module Foo
  def method_added(method_name)
    puts "method #{method_name} added"
  end
end

class Bar
  extend Foo

  def some_method
  end
end
  

Обратите внимание, что method_added — это метод класса (строго метод экземпляра экземпляра класса класса sic!), Поскольку он определен в классе модуля. Поэтому мы должны добавить его с помощью extend, чтобы он переходил в метакласс Bar.

Ответ №3:

Если я правильно понял ваш вопрос,

class_instance.send(имя_метода)

должен это сделать

Комментарии:

1. Разве это не просто эквивалент object.method() ? Я хочу автоматически вызывать метод каждый раз, когда я определяю новый метод в классе.