在模块中使用`require`而不是在顶部有什么好处?

Jam*_*Lim 12 ruby

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

module Capybara
  module Poltergeist
    require 'capybara/poltergeist/utility'
    require 'capybara/poltergeist/driver'
    require 'capybara/poltergeist/browser'
    # more requires
  end
end
Run Code Online (Sandbox Code Playgroud)

实际来源

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

Chr*_*ald 8

这种情况下的优点是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
Run Code Online (Sandbox Code Playgroud)

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

module Foo
  module Bar
    require './bar_module'
  end
end
Run Code Online (Sandbox Code Playgroud)

需求将起作用,因为Foo::Barbar_module开始做它的时候将存在.

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