Если единственное намерение состоит в том, чтобы установить значения по умолчанию, а не переопределять методы, то следующий трюк поможет: некоторые значения по умолчанию. Если это единственная функция, которая вам нужна, это ваш ответ, если вы также планируете переопределить методы, читайте дальше.
Это не работает, если вы планируете пересмотреть методы. HTTParty
будет добавлен в стек предков перед SuperClient
. При вызове методов, определенных как SuperClient
, так и HTTParty
, первым будет вызываться вариант HTTParty
, то есть вариант SuperClient
никогда не будет достигнут.
Это может быть больше информации, чем вам нужно, но указанную выше проблему можно решить, выполнив:
module SuperClient
def self.included(base)
base.include HTTParty
base.include InstanceMethods
base.extend ClassMethods
# defaults
# ...
end
module InstanceMethods
# ...
end
module ClassMethods
# ...
end
end
Включив InstanceMethods
и расширив ClassMethods
после включения HTTParty
, они будут располагаться выше в стеке, что позволит вам повторно определить методы и вызвать super
.
class C
include SuperClient
end
# methods are search for from top to bottom
puts C.ancestors
# C
# SuperClient::InstanceMethods
# HTTParty::ModuleInheritableAttributes
# HTTParty
# SuperClient
# Object
# JSON::Ext::Generator::GeneratorMethods::Object
# Kernel
# BasicObject
puts C.singleton_class.ancestors
# #<Class:C>
# SuperClient::ClassMethods
# HTTParty::ModuleInheritableAttributes::ClassMethods
# HTTParty::ClassMethods
# #<Class:Object>
# #<Class:BasicObject>
# Class
# Module
# Object
# JSON::Ext::Generator::GeneratorMethods::Object
# Kernel
# BasicObject