2011-02-06 89 views
4

在我的Rails應用我有一個型號/ foo.rb型號/富/ exceptions.rbruby​​類和具有相同名稱的模塊之間的關係是什麼?

class Foo 
    include Foo::Exceptions 
end 

module Foo::Exceptions 
    class MySpecialException < Exception 
    end 
end 

在軌控制檯,然後我看到:

>> 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中看到的行爲不一致的錯誤。

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

回答

3

什麼是Ruby類和模塊具有相同的名稱之間的關係?

一個類和一個模塊在ruby中不能有相同的完全限定名。可以有一個類Foo::Bar和一個模塊Baz::Bar,在這種情況下,類和模塊之間沒有關係。然而,不可能同時擁有類Foo::Bar和模塊Foo::Bar

(我不知道這是什麼了,雖然你的問題的其餘部分做)

是Foo中我包容行必要的,或確實Rails的autoinclude這些模塊?

Rails不會自動包含您的模塊。然而,這並不意味着有必要包括自己,你可以只接觸它合格。即在Foo類中使用Exceptions::MySpecialException而不是MySpecialException

爲什麼MySpecialException存在於頂層Foo命名空間並指向Foo :: Exceptions :: MySpecialException?

因爲您將Foo::Exceptions納入Foo。由於Foo::Exceptions的所有實例方法也是Foo的實例方法,並且所有常量Foo::Exceptions也都是Foo的常量 - 包括MySpecialException

這是什麼意思,這兩個類==而不是===?

==意味着它是相同的類。這不是===意味着該類不是它自己的一個實例(因爲x === yy.is_a?(x)相同,如果x是一個類)。

+0

「(我不確定這與你的問題的其餘部分有什麼關係)」 - 因爲'module Foo :: Bar'沒有暗示'模塊'Foo`也存在嗎? – 2011-02-07 03:54:24

1
  1. 我建議你移動例外LIB:LIB /異常/ 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/**/"]

+0

謝謝!你爲什麼認爲我應該在那裏例外?我認爲將它們放在其他模型代碼旁邊很好。 – 2011-02-07 03:59:44

相關問題