2016-09-20 45 views
2

ruby​​中似乎有兩種類型的類型,我不需要它們總是可以訪問的(比如Float,Array,Hash等)。他們是紅寶石的一部分,這是預期的。爲什麼在Rails中應該明確需要一些Ruby常量(類,模塊)?

但也有一些常數,除非明確要求(如REXMLObservableYAML)不可訪問。它們也是Ruby的一部分,我希望能夠在沒有要求的情況下訪問它們。

爲什麼這些常數不可用沒有要求?

在Rails指南中,不建議明確地要求任何東西,因爲這會弄亂Rails自動加載機制。如果無論如何都需要這些常量,那麼最好的辦法是什麼?

我應該使用要求require_dependency

我應該在使用常量的文件頂部使用require還是應該在全局中以某種方式執行?

編輯:另外,由於常量的可用性取決於加載順序,因此很容易忘記需要某個文件,直到加載順序發生某種變化時纔會中斷。除了對使用的每一個常量都額外警惕之外,不要面對這種錯誤的最佳方式是什麼?

回答

2

有兩種東西是「內置的」。

  1. Ruby核心。這些東西你不需要。它們是語言本身的一部分。陣列,散列等
  2. 標準庫(stdlib)。像Struct,OpenStruct,Time等附加功能等。它們對於語言來說並不重要。只需提供給您的功能即可。如果您在程序中不使用REXML,則無需加載(這會浪費CPU時間和內存)。所以,在使用它們之前你必須要求這些東西。

如果無論如何都需要這些常量,那麼最好的方法是什麼?

如果你沒有對他們進行monkeatch,那麼你只要繼續,並要求他們無論你想要的。我通常在文件的頂部使用它們。

如果你做他們monkeypatch,我建議你重新考慮。 :)

+0

好的,這很好,我可以要求他們在頂部。但考慮下一種情況:我在多個文件中使用常量。所以我應該在頂部的每個文件中要求它。但是ruby並沒有強制我這麼做,如果一個文件已經加載了所有在可以使用該常量之後加載的文件。 問題是我可以很容易地忘記需要文件,如果它的工作沒有要求,如果加載順序改變它會打破。 –

+0

@LevDenisov:這引入了加載順序依賴關係。不要這樣做。要麼在引導文件中或在使用它的每個單獨文件中都需要該東西。 –

+0

@LevDenisov:有一次,我花了兩天時間精確地調試了這個:神祕的錯誤,起源於某種情況下加載的東西,而不是加載到另一箇中。 –

相關問題