在我的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 === yy.is_a?(x)是类时的x相同)。

09-10 03:15
查看更多