在我的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?
最佳答案
一个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
相同)。