在我的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
Foo
,或者Rails是否自动包含这些模块?MySpecialException
存在于顶级Foo
命名空间中并指向Foo::Exceptions::MySpecialException
?==
但不是===
是什么意思?我在irb中对此进行了探讨,但仍然遇到了与我在Rails中看到的行为不一致的错误。
相关:What is a conventional place to keep custom Exception definitions in a rails project?
答案 0 :(得分:3)
ruby类和具有相同名称的模块之间有什么关系?
类和模块在ruby中不能具有相同的完全限定名称。可以有一个类Foo::Bar
和一个模块Baz::Bar
,在这种情况下,类和模块之间没有关系。但是,它们不可能同时具有类Foo::Bar
和模块Foo::Bar
。
(我不确定这与你的其余问题有什么关系)
我的包含行是否必要,或者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 :(得分:1)
Rails会自动加载模型目录中的东西,但是对于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/**/"]