Ruby включает цепной модуль после загрузки класса - PullRequest
0 голосов
/ 15 мая 2018

У меня есть ситуация, когда я должен загрузить свой модуль после загрузки класса. Здесь ниже образец кода

require 'active_support/concern'
module A
  extend ActiveSupport::Concern
  def method_a
    puts "Method_a"
  end
end

module B
  extend ActiveSupport::Concern
  def method_b
    puts "Method_b"
  end
end

class Ab
  include B
  def calltest
    method_a
    method_b
  end
end

B.send(:include, A)

Ab.new.method_a
Ab.new.method_b

В приведенном выше примере, когда я звоню method_a, выдается ошибка. Но если переместить эту строку выше Ab класса, он работает нормально. Я не хочу включать A модуль в класс Ab. Может ли кто-нибудь помочь мне позвонить без изменения порядка кода?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы можете просто включить модуль A в модуль B:

module A
  def method_a
    puts "Method_a"
  end
end

module B
  include A

  def method_b
    puts "Method_b"
  end
end

class Ab
  include B

  def calltest
    method_a
    method_b
  end
end

Ab.new.calltest
# Method_a
# Method_b
#=> nil
0 голосов
/ 15 мая 2018

Почему вы включаете A в B, а не в Ab?Это будет работать:

# B.send(:include, A)
Ab.include A

Ваш код не работает, потому что include B выполняется и в основном все методы из B добавляются в базу.Можно реализовать обратный вызов self.included в B, собрать все классы / модули, которые включены в , и обновить их все, когда include вызывается для своего собственного класса, но это выглядит как странное излишество.

Sidenote: Module#include публично.

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