通常,我将大多数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这种方式有什么好处?
这种情况下的优点是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::Bar在bar_module开始做它的时候将存在.
在这个特定的例子中,它没有太多实际效果,因为Poltergeist使用嵌套模块语法(module Foo; module Bar)而不是折叠语法(module Foo::Bar),但这是一个很好的做法,基本上描述"这些需要期望这个模块存在".