ruby类和具有相同名称的模块之间的关系是什么?

时间:2011-02-06 23:48:02

标签: ruby-on-rails ruby class exception module

在我的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. 这两个类是==但不是===是什么意思?
  5. 我在irb中对此进行了探讨,但仍然遇到了与我在Rails中看到的行为不一致的错误。

    相关:What is a conventional place to keep custom Exception definitions in a rails project?

2 个答案:

答案 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)

  1. 我建议你将例外移到lib:lib / exceptions / exception_name.rb
  2. 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/**/"]