2016-09-20 31 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:有一次,我花了两天时间精确地调试了这个:神秘的错误,起源于某种情况下加载的东西,而不是加载到另一个中。 –