Запуск кода после того, как класс полностью загружен - PullRequest
6 голосов
/ 05 октября 2009
class A
  do_something_from_b

  def method_in_a
  end
end

module B
  def self.included base
    base.extend ClassMethods
  end

  module ClassMethods
    def do_something_from_b
      A.class_eval do
        alias_method :aliased_method_in_a, :method_in_a
      end
    end
  end
end

A.send(:include, B)

Этот код потерпит неудачу, потому что когда вызывается do_somethind_from_b, method_in_a еще не существует.

Так есть ли способ подключиться к class A после его полной загрузки, без , поставив вызов do_something_from_b в конце class A?

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

Спасибо!

1 Ответ

6 голосов
/ 05 октября 2009

В Ruby класс никогда не загружается полностью. Вы можете открыть его, когда захотите.

class A
  def method_in_a
    …
  end
end

Вы можете сделать это позже, независимо от того, где находится ваш код (даже в другом файле исходного кода).

class A
  alias :aliased_method_in_a :method_in_a
end

или вы можете сделать это так, как написали (что в точности совпадает с предыдущим кодом)

A.class_eval do
  alias :aliased_method_in_a :method_in_a
end

Как вы указали, # method_in_a должен существовать в тот момент, когда вы его называете. Чтобы убедиться, что это правда, вы можете сделать

require "file_of_class_a"

перед тем, как сделать псевдоним. Если вы не знаете, когда будет создан метод A # method_in_a, вы можете сделать

class A
  def self.method_added(name)
    alias :aliased_method_in_a :method_in_a if name == :method_in_a
  end
end

A.method_added автоматически вызывается всякий раз, когда метод в A определен.

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