2013-08-15 7 views
9

通常、ファイルの先頭に私のrequire文の大部分を入れています。ポルターガイストのソースコードを読んでいる間、私は気づい次モジュールの内部ではなく `require 'を使う利点は何ですか?

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

Actual source

requireこの方法を使用することの利点は何ですか?

答えて

6

この場合の利点は、これらのモジュールが必要となる前に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 

ザ・はFoo::Barbar_module開始はそのことをやっている時間によって存在することから、動作しますが必要です。この特定の例では

、ポルターガイストは、ネストされたモジュールの構文(module Foo; module Bar)ではなく崩壊構文(module Foo::Bar)を使用しているので、それは、多くの実用的な効果を持っていないが、それは基本的にこれらは、このことを期待して必要とする「線引きするとよいでしょうモジュールを存在させる "。

2

私はあなたの例でどのような利点があるのか​​わかりません。

メソッド定義内にrequireを使用することがあります。

私はめったに使用されないが、大きなライブラリが必要な方法でこれを行います。利点:大きなライブラリは、本当に必要なときにのみロードされます。

requireライブラリが既にロードされているかどうかを確認します。だから、ライブラリを二重にロードすることに問題はありません。

+0

メソッドの中にrequireを挿入するのではなく、autoloadメソッドを使用するほうがよいでしょうか?私はコールで必要なときにのみロードするので、より洗練されたソリューションになると思います –

関連する問題