как вызвать тот же метод модуля, что и метод экземпляра и метод класса в классе ruby - PullRequest
1 голос
/ 30 марта 2019

Я хочу вызвать тот же метод модуля, что и метод класса, а также метод экземпляра в классе Ruby.пример

module Mod1
  def method1
  end
end

class A
end

Я хочу вызвать method1 как A.new.method1 или A.method1.

Ответы [ 2 ]

2 голосов
/ 30 марта 2019

Как упомянул @Karthik, вы можете иметь класс include и extend для модуля:

module Mod1
  def method1
    'hi'    
  end
end

class A
end

A.include Mod1
A.extend Mod1

A.new.method1 #=> 'hi'
A.method1     #=> 'hi'

A.extend Mod1 не более чем

A.singleton_class.include Mod1

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

module Mod1
  def method1
    'hi'
  end      
  def self.included(klass)
    klass.extend(self)
  end
end

В этом случае модуль должен быть только include d по классу:

class A
end

A.include Mod1

A.new.method1 #=> 'hi'
A.method1     #=> 'hi'

Модуль :: включен называется методом обратного вызова или hook . A.include Mod1 заставляет Mod1::included выполняться с klass, равным A и self, равным Mod1.

Кроме того, есть несколько других методов обратного вызова, которые могут быть использованы для хорошего эффекта. Возможно, наиболее важными являются Module :: extended , Module :: prepended и Class :: наследуется .

1 голос
/ 30 марта 2019

Не могу себе представить, что это хороший дизайн ... но вы можете попробовать и include, и extend модуль в классе.include добавляет методы как методы экземпляра и `e http://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/

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