2013-08-15 10 views
9

Normalerweise stecke ich die meisten meiner require-Anweisungen an der Spitze einer Datei. Während der Quellcode für Poltergeist zu lesen, bemerkte ich die folgendenWas sind die Vorteile der Verwendung von `require` in einem Modul statt an der Spitze?

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

Actual source

Was sind die Vorteile von require auf diese Weise mit?

Antwort

6

Der Vorteil in diesem Fall ist, dass das Capybara::Poltergeist Modul existiert, bevor diese Module benötigt werden. Da diese Module alle das Capybara::Poltergeist Modul erweitern, ist dies nur eine Möglichkeit, sicherzustellen, dass sie nicht geladen werden, bevor das Modul tatsächlich verfügbar ist. Das Setzen der Require-Anweisungen nach der Moduldefinition hätte den gleichen Effekt.

Beachten Sie Folgendes:

# foobar.rb 
require './bar_module' 

module Foo 
    module Bar 
    end 
end 

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

Dieses Setup fehl, weil das nicht verschachtelte Foo::Bar Syntax Foo bereits durch die Zeit existiert dieses Modul aufgerufen wird, erwarten wird. Durch die Änderung der ersten Datei auf:

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

Das erfordert arbeiten, da Foo::Bar durch die Zeit existieren wird, dass bar_module beginnt seine Sache tut.

In diesem speziellen Fall ist es nicht viel praktische Wirkung hat, da Poltergeist die verschachtelte Modul Syntax (module Foo; module Bar), anstatt die kollabierte Syntax (module Foo::Bar) verwendet, aber es ist eine gute Praxis, dass „diese erfordern erwarten, dass dies im Grunde umreißt Modul zu existieren ".

2

Ich weiß nicht, was der Vorteil in Ihrem Beispiel ist.

Ich verwende manchmal require innerhalb einer Methodendefinition.

Ich mache dies für Methoden, die selten verwendet werden, aber große Bibliotheken benötigen. Der Vorteil: Die große Bibliothek wird nur geladen, wenn sie wirklich benötigt wird.

require überprüft, ob die Bibliothek bereits geladen ist. Ich habe also kein Problem damit, eine Bibliothek doppelt zu laden.

+0

Wäre es nicht besser, die Autoload-Methode zu verwenden, anstatt die require innerhalb der Methode einzufügen? Ich denke, es wäre eine elegantere Lösung, da ich es nur bei Bedarf auf den Anruf laden würde –

Verwandte Themen