Хорошо, я постараюсь помочь здесь:
Во-первых, модуль не является классом, он позволяет смешивать поведение в классе. второй см. следующий пример:
module A
module B
module Error
def foobar
puts "foo"
end
end
end
end
class StandardError
include A::B::Error
end
StandardError.new.kind_of?(A::B::Error)
StandardError.new.kind_of?(A::B)
StandardError.included_modules #=> [A::B::Error,Kernel]
kind_of? говорит, что да, Error обладает поведением All A :: B :: Error (что является нормальным, поскольку оно включает A :: B :: Error), однако оно не включает в себя все поведение из A :: B и, следовательно, не является типа A :: B. (утка печатает)
Теперь есть очень хороший шанс, что ruby-aws повторно откроет один из суперклассов NameError и включит Amazon :: AWS: там есть Ошибка. (обезьяна исправления)
Вы можете программно узнать, где модуль включен в иерархию, с помощью следующего:
class Class
def has_module?(module_ref)
if self.included_modules.include?(module_ref) and not self.superclass.included_modules.include?(module_ref)
puts self.name+" has module "+ module_ref.name
else
self.superclass.nil? ? false : self.superclass.has_module?(module_ref)
end
end
end
StandardError.has_module?(A::B::Error)
NameError.has_module?(A::B::Error)
Что касается вашего второго вопроса, я не вижу ничего лучше, чем
begin
#do AWS error prone stuff
rescue Exception => e
if Amazon::AWS::Error.constants.include?(e.class.name)
#awsError
else
whatever
end
end
(edit - приведенный выше код не работает как есть: имя включает префикс модуля, который не относится к массивам констант. Вам определенно следует обратиться к сопровождающему lib, класс AWSError для меня больше похож на класс фабрики: / )
У меня нет ruby-aws, и сайт caliban заблокирован брандмауэром компании, поэтому я не могу тестировать дальше.
Относительно включения: это может быть то, что делает обезьяны, исправляющие иерархию StandardError. Я больше не уверен, но, скорее всего, делать это в корне файла вне каждого контекста, включая модуль Object или метакласс Object. (это то, что происходит в IRB, где контекстом по умолчанию является Object, не уверенный в файле)
из кирки для модулей :
A couple of points about the include statement before we go on. First, it has nothing to do with files. C programmers use a preprocessor directive called #include to insert the contents of one file into another during compilation. The Ruby include statement simply makes a reference to a named module. If that module is in a separate file, you must use require to drag that file in before using include.
(редактировать - я не могу комментировать с помощью этого браузера: / yay для заблокированных на платформах)