14

通常,我将大部分require语句放在文件的顶部。在阅读 Poltergeist 的源代码时,我注意到以下内容

module Capybara
  module Poltergeist
    require 'capybara/poltergeist/utility'
    require 'capybara/poltergeist/driver'
    require 'capybara/poltergeist/browser'
    # more requires
  end
end

实际来源

使用require这种方式有什么好处?

4

2 回答 2

9

这种情况下的优点是Capybara::Poltergeist模块在需要这些模块之前就已经存在。由于这些模块都扩展了Capybara::Poltergeist模块,这只是一种确保在模块实际可用之前不加载它们的方法。在模块定义之后放置 require 语句将具有相同的效果。

考虑以下:

# foobar.rb
require './bar_module'

module Foo
  module Bar
  end
end

# bar_module.rb
module Foo::Bar
   def baz
     "hi!"
   end
end

此设置将失败,因为在调用此模块时,非嵌套Foo::Bar语法预计Foo已经存在。通过将第一个文件更改为:

module Foo
  module Bar
    require './bar_module'
  end
end

require 会起作用,因为它会在开始做它Foo::Bar的时候存在。bar_module

在这个特定的例子中,它没有太大的实际效果,因为 Poltergeist 使用嵌套模块语法 ( module Foo; module Bar) 而不是折叠语法 ( module Foo::Bar),但这是一个很好的实践,基本上描述了“这些要求期望这个模块存在”。

于 2013-08-15T21:07:03.377 回答
2

我不知道你的例子有什么好处。

我有时require在方法定义中使用。

我为很少使用但需要大型库的方法执行此操作。优点:大型库仅在真正需要时才加载。

require检查是否已加载库。所以我对双重加载库没有问题。

于 2013-08-15T18:44:37.073 回答