2017-02-21 3 views
1

Я использую HTTParty, и на основе документации вы можете создать класс:Как работает self.class.method при включении модуля?

class SomeClass 
    include HTTParty 
    base_uri 'host' 
    def index 
     self.class.get('/path') 
    end 
end 

Я не уверен, как get метод объявлен внутри модуля.

+1

модуль предоставляет методы одноуровневого класса, вот как вы получаете 'self.class.get', работающий –

+1

** tl; dr ** - [' included' hook] (https://github.com/jnunemaker/httparty /blob/master/lib/httparty.rb#L19-L26). – ndn

ответ

2

Метод get определяется на line 484 of httparty/httparty.rb

def get(path, options = {}, &block) 
    perform_request Net::HTTP::Get, path, options, &block 
end 

Это определяется на модуле, называемом ClassMethods. Если вы посмотрите дальше файл httparty/httparty.rb. В строке 20 вы увидите:

def self.included(base) 
    base.extend ClassMethods 

method included вызывается, когда модуль входит в другой модуль или класса.

Этот код гарантирует, что когда модуль HTTParty включен в другой модуль или класс, методы, определенные в HTTParty::ClassMethods, расширены (добавлены как методы класса) на объект-хост. Они становятся классными методами.