Какая связь между классом ruby и модулем с тем же именем?
Класс и модуль не могут иметь одно и то же полное имя в ruby.Возможно иметь класс Foo::Bar
и модуль Baz::Bar
, и в этом случае нет никакой связи между классом и модулем.Однако невозможно одновременно иметь класс Foo::Bar
и модуль Foo::Bar
.
(хотя я не уверен, что это имеет отношение к остальной части вашего вопроса)
Нужна ли моя строка включения в Foo или Rails автоматически включает эти модули?
Rails не будет автоматически включать ваши модули.Однако это не означает, что необходимо включать себя, вы можете просто получить квалифицированный доступ к нему.То есть используйте Exceptions::MySpecialException
вместо MySpecialException
внутри Foo
класса.
Почему MySpecialException существует в пространстве имен Foo верхнего уровня и указывает на Foo :: Exceptions :: MySpecialException?
Поскольку вы включили Foo::Exceptions
в Foo
.Из-за этого все методы экземпляра Foo::Exceptions
также являются методами экземпляра Foo
, и все константы Foo::Exceptions
также являются константами Foo
, включая MySpecialException
.
Что этоозначает, что эти два класса ==, но не ===?
==
означает, что это один и тот же класс.То, что это не ===
, означает, что класс не является самим экземпляром (поскольку x === y
совпадает с y.is_a?(x)
, если x
является классом).