Próbuję zrozumieć kod z github repo. To główny moduł klejnotu do ustawienia klienta.Dlaczego moduł `ClassMethods` zdefiniowany i rozszerzony w tej samej przestrzeni nazw?
module Github
# more code
class << self
def included(base)
base.extend ClassMethods # what would this be for?
end
def new(options = {}, &block)
Client.new(options, &block)
end
def method_missing(method_name, *args, &block)
if new.respond_to?(method_name)
new.send(method_name, *args, &block)
elsif configuration.respond_to?(method_name)
Github.configuration.send(method_name, *args, &block)
else
super
end
end
def respond_to?(method_name, include_private = false)
new.respond_to?(method_name, include_private) ||
configuration.respond_to?(method_name) ||
super(method_name, include_private)
end
end
module ClassMethods
def require_all(prefix, *libs)
libs.each do |lib|
require "#{File.join(prefix, lib)}"
end
end
# more methods ...
end
extend ClassMethods
require_all LIBDIR,
'authorization',
'validations',
'normalizer',
'parameter_filter',
'api',
'client',
'pagination',
'request',
'response',
'response_wrapper',
'error',
'mime_type',
'page_links',
'paged_request',
'page_iterator',
'params_hash'
end
- Dlaczego
class << self
imodule ClassMethods
używane, a następnie rozszerzony zamiast być zawarte wclass << self
części? - Istnieje metoda klasy
def included(base)
. To wydaje się dodawać metody klasy do określonego obiektu. Dlaczego tak jest? Może odnosić się do funkcjonalności klasy, ale ja jej nie rozumiem.
to ma sens. Jestem trochę zdezorientowany z powodu metody "self.included (base)", czy mógłbyś wyjaśnić, po co to jest i jak to się odnosi do modułu 'M' lub klasy' P' –
, gdy 'P' nazywa' to M', ruby automatycznie wywołuje 'włączone' na' M' jeśli jest zdefiniowane. Jest to wywołanie zwrotne metody include. Jest to użyteczne do rozszerzenia metod klasy modułu na 'P'. Zobacz: http://ruby-doc.org/core-2.2.0/Module.html#method-i-included – DGM
Czy jest jakaś szansa, aby wskazać mi praktyczny przykład tego? Wciąż nie jestem jasny w sprawie sytuacji, w których byłby wykorzystywany. Jestem pewien, że po prostu muszę zobaczyć praktyczny przykład, aby zrozumieć jego prawdziwą aplikację. –