Какова связь между классом ruby ​​и модулем с тем же именем? - PullRequest
4 голосов
/ 07 февраля 2011

В моем приложении rails у меня есть models / foo.rb и models / foo / exceptions.rb :

class Foo
  include Foo::Exceptions
end

module Foo::Exceptions
  class MySpecialException < Exception
  end
end

На консоли rails,Затем я вижу это:

>> Foo::MySpecialException
Foo::Exceptions::MySpecialException < Exception
>> Foo::MySpecialException == Foo::Exceptions::MySpecialException
true
>> Foo::MySpecialException === Foo::Exceptions::MySpecialException
false
  1. Что вы думаете о моей файловой структуре / пространстве имен?
  2. Нужна ли моя строка включения в Foo, или Rails автоматически включает эти модули??
  3. Почему MySpecialException существует в пространстве имен Foo верхнего уровня и указывает на Foo::Exceptions::MySpecialException?
  4. Что означает, что эти два класса ==, но не ===?

Я исследовал это в irb, но продолжал сталкиваться с ошибками, которые не соответствовали поведению, которое я (думаю) видел в Rails.

related: Чтотакое обычное место для хранения пользовательских определений исключений в проекте rails?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2011

Какая связь между классом 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 является классом).

1 голос
/ 07 февраля 2011
  1. Я предлагаю вам перенести исключения в lib: lib / exceptions / имя_ исключения.rb
  2. Rails будет автоматически загружать вещи в моделях dir, однако для папки lib вы должны сделать это, проверив config / application.rb и добавив следующее:

    # Custom directories with classes and modules you want to be autoloadable.

    config.autoload_paths += %W(#{config.root}/lib)

    config.autoload_paths += Dir["#{config.root}/lib/**/"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...