Ruby要求语句是在类定义的内部还是外部?

在Ruby中使用类文件时,是否将“require”语句放在文件的顶部,还是放在类定义中?

从技术上讲,这并不重要。 require只是一个普通的方法调用,调用的范围不影响它的工作方式。 唯一不同的位置是,当它被放置的代码被评估时,它将被执行。

实际上,您应该把它们放在顶部,以便人们可以一目了然地查看文件的依赖关系。 这是传统的地方。

在顶部。

 require 'rubygems' require 'fastercsv' class MyClass # Do stuff with FasterCSV end 

我可以看到一个可能的原因,就是没有在文件的顶部放置一个require :加载的代价很高,而且并不总是执行。 发生在我身上的一种情况是,例如,代码和它的testing位于同一个文件中,这对于特定的小型库代码而言是我不时要做的事情。 然后我可以从我的编辑器运行该文件,并运行testing。 在这种情况下,当文件require从其他地方进入时,我不想要加载test/unit

有点像这样的东西:

 def some_useful_library_function() return 1 end if __FILE__ == $0 require 'test/unit' class TestUsefulThing < Test::Unit::TestCase def test_it_returns_1 assert_equal 1, some_useful_library_function() end end end 

放置它们并不重要,但是如果将它们放在 classmoduleexpression式中,那么它看起来像是将require d文件中的所有内容导入到类的名称空间中,这不是真的:一切都结束了在全局名称空间(或者在库中定义的任何名称空间)中。

所以,最好把它们放在最上面以避免混淆。

在文件顶部,大多数(但不是全部)语言以这种方式处理导入。 我发现这样处理它们更简单,更容易。

我认为这只是真的有意义…就像你在一个文件中途:

 class Foo def initialize(init_value) @instance_var = init_value # some 500 lines of code later.... end end class Bar # oh look i need an import now! require 'breakpoint' 

正如你所看到的那样,追踪它们将是非常困难的。 更不用说,如果你想在你的代码的早些时候使用导入的函数,你可能不得不退出并重新包含它,因为其他导入将是特定于该类的。 导入相同的文件也会在运行时产生很多开销。

我觉得这个要求的陈述属于课堂内部。 使用类意味着我们正在接受OOP的一个基本原则,即对象应尽可能松散耦合。 对我来说这意味着最大限度地减less外部依赖。 如果我后来把一个类移到它自己的文件中,我不想让它中断,因为我没有find这个类所需要的所有必需的语句。

它不会导致任何问题在文件中具有重复的require语句,并且简化了inheritance您的代码的下一个程序员将​​不可避免地发生的重构。